我想在用户输入应用程序时创建用户评论。并在需要时阅读会话。这是我的尝试
var io = require('socket.io'), express = require('express'); querystring = require('querystring'); var app = express.createServer(); app.get('/', function(req, res){ var sessionVal = querystring.parse(req.url.substr(2));// sessionVal is an email for example: me@gmail.com app.use(express.cookieParser()); app.use(express.session({ secret: sessionVal })); }); var socket = io.listen(app); socket.on('connection', function(client) { client.on('message', function(message) { // message will be an object {text:'user text chat blah blah', email:'me@gmail.com'} // if the seesion stored, has the same value with message.email // then the message will be broadcasted socket.broadcast(message.text); // else will not broadcast }); }); app.listen(4000);
我需要在这里指出您错误地将中间件添加到应用程序中。该app.use电话不应该内完成app.get的请求处理程序,但它的外面。只需在之后直接调用它们createServer,或查看文档中的其他示例。
app.use
app.get
createServer
您传递给的机密express.session应该是字符串常量,或者应该是从配置文件中获取的机密。不要喂它客户可能知道的东西,这实际上很危险。只有服务器应该知道的秘密。
express.session
如果要在会话中存储电子邮件地址,只需执行以下操作:
req.session.email = req.param('email');
有了这个…
如果我理解正确,那么您想要做的就是处理一个或多个HTTP请求并跟踪会话,然后稍后打开一个Socket.IO连接,您还需要从中进行会话数据。
关于此问题的棘手问题是,Socket.IO的方法http.Server可以通过劫持该request事件来使魔术在任何事物上起作用。因此,永远不会在Socket.IO连接上调用Express(或Connect)的会话中间件。
http.Server
request
我相信您可以通过一些技巧来完成这项工作。
您可以获取Connect的会话数据。您只需要获取对会话存储的引用。最简单的方法是在调用之前自己创建商店express.session:
// A MemoryStore is the default, but you probably want something // more robust for production use. var store = new express.session.MemoryStore; app.use(express.session({ secret: 'whatever', store: store }));
每个会话存储区都有一个get(sid, callback)方法。的sid参数,或会话ID,被存储在客户端上的cookie。该Cookie的默认名称为connect.sid。(但是您可以通过key在express.session呼叫中指定选项来给它起任何名字。)
get(sid, callback)
sid
connect.sid
key
然后,您需要在Socket.IO连接上访问该cookie。不幸的是,Socket.IO似乎并没有授予您访问的权限http.ServerRequest。一个简单的解决方法是在浏览器中获取cookie,然后通过Socket.IO连接发送它。
http.ServerRequest
服务器上的代码将如下所示:
var io = require('socket.io'), express = require('express'); var app = express.createServer(), socket = io.listen(app), store = new express.session.MemoryStore; app.use(express.cookieParser()); app.use(express.session({ secret: 'something', store: store })); app.get('/', function(req, res) { var old = req.session.email; req.session.email = req.param('email'); res.header('Content-Type', 'text/plain'); res.send("Email was '" + old + "', now is '" + req.session.email + "'."); }); socket.on('connection', function(client) { // We declare that the first message contains the SID. // This is where we handle the first message. client.once('message', function(sid) { store.get(sid, function(err, session) { if (err || !session) { // Do some error handling, bail. return; } // Any messages following are your chat messages. client.on('message', function(message) { if (message.email === session.email) { socket.broadcast(message.text); } }); }); }); }); app.listen(4000);
假设您只想读取现有会话。您实际上无法创建或删除会话,因为Socket.IO连接可能没有HTTP响应来发送Set- Cookie标头(请考虑使用WebSockets)。
Set- Cookie
如果要编辑会话,则可以在某些会话存储中使用。例如,CookieStore无效,因为它还需要发送一个Set- Cookie标头,但它不能。但是对于其他商店,您可以尝试调用该set(sid, data, callback)方法,看看会发生什么。
set(sid, data, callback)