需要指出的是,您正在错误地将中间件添加到应用程序中。 app.use
调用不应在 app.get
请求处理程序内部完成,而应在其外部直接调用它们,或者参考文档中的其他示例。
传递给 express.session
的密钥应该是一个字符串常量,或者可能来自配置文件。不要传递客户端可能知道的内容,这实际上是危险的。这是仅服务器应该知道的秘密。
如果您想将电子邮件地址存储在会话中,只需执行类似以下方式的操作:
req.session.email = req.param('email')
先说一下,如果我理解正确的话,你想要做的是处理一个或多个HTTP请求并跟踪一个会话,然后稍后从中打开一个Socket.IO连接,其中你需要会话数据。
这个问题的棘手之处在于,Socket.IO 使魔法在任何 http.Server
上生效的方法是通过劫持 request
事件。因此,Express(或者更确切地说是Connect)的会话中间件永远不会被 Socket.IO 连接调用。
我相信你可以通过一些巧妙的方法让它工作起来。
你可以获取 Connect 的会话数据;你只需要获取一个对会话存储的引用即可。最简单的方法是在调用 express.session
之前自己创建存储。
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
选项来更改任何名称。)
然后,您需要在Socket.IO连接中访问该cookie。不幸的是,Socket.IO似乎没有提供对
http.ServerRequest
的访问。简单的解决方法是在浏览器中获取cookie,并将其通过Socket.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) {
client.once('message', function(sid) {
store.get(sid, function(err, session) {
if (err || !session) {
return;
}
client.on('message', function(message) {
if (message.email === session.email) {
socket.broadcast(message.text);
}
});
});
});
});
app.listen(4000);
假设您只想读取现有会话。 您实际上无法创建或删除会话,因为Socket.IO连接可能没有要发送Set-Cookie
标头的HTTP响应(考虑WebSockets)。
如果您想编辑会话,则可以尝试在某些会话存储中使用。例如,CookieStore将无法工作,因为它还需要发送Set-Cookie
标头,但是对于其他存储,您可以尝试调用set(sid, data, callback)
方法,然后查看发生了什么。
req.session
。正如我在示例中展示的那样,你可以使用req.session.email
访问存储的电子邮件。 - Stéphan Kochenexpress.session
还有一个cookie
选项。请参阅:http://senchalabs.github.com/connect/middleware-session.html - Stéphan Kochen