我需要在这里指出,您错误地将中间件添加到应用程序中.app.use
个调用不应在app.get
请求处理程序内完成,而应在其外部完成.只需在createServer
之后直接给他们打电话,或者看看the other examples in the docs.
传递给express.session
的秘密应该是一个字符串常量,或者是从配置文件中获取的内容.不要给它提供客户可能知道的东西,这实际上很危险.这是一个只有服务器应该知道的秘密.
如果您想在会话中存储邮箱地址,只需执行以下操作:
req.session.email = req.param('email');
有了这条路...
如果我理解正确,您要做的是处理一个或多个HTTP请求并跟踪会话,然后稍后打开一个套接字.IO连接,您也需要从中获取会话数据.
这个问题的棘手之处在于插座.木卫一让魔法在任何http.Server
上发挥作用的方法是劫持request
事件.因此,永远不会在套接字上调用Express(或者说Connect)会话中间件.IO连接.
不过,我相信你可以通过一些技巧来实现这一点.
您可以访问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
.(但您可以通过在express.session
通话中指定key
选项为其命名.)
然后,您需要访问套接字上的cookie.IO连接.不幸的是,插座.IO似乎不允许你访问http.ServerRequest
.一个简单的解决方法是在浏览器中获取cookie,然后通过套接字发送.IO连接.
服务器上的代码将如下所示:
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);
这假设您只想读取现有会话.您实际上无法创建或删除会话,因为套接字.IO连接可能没有HTTP响应来发送Set-Cookie
报头(想想WebSockets).
如果要编辑会话,可以使用某些会话存储.例如,CookieStore不起作用,因为它还需要发送一个Set-Cookie
头,但它不能.但是对于其他store ,你可以try 调用set(sid, data, callback)
方法,看看会发生什么.