我正在尝试解决在 socket.io 中访问会话变量的臭名昭著的问题。我基本上已经阅读了谷歌上关于这个主题的每个链接,但我仍在挣扎。
在我所有的路由之后,我有这个:
io.set('authorization', function(data,accept)
{
data.cookie = cookie.parse(data.headers.cookie);
---> console.log(data.cookie);
data.sessionID = connect.utils.parseSignedCookie(data.cookie['express.sid'].split('.')[0].substring(2), conf.sessionSecret);
sessionStore.get(data.sessionID, function (err, session)
{
console.log(session);
});
});
不幸的是,控制台.log我画了一个箭头来返回以下内容:
{ 'connect.sid': 's:3pIi31DPthO8KVOjqzYpeL75.nHvKOpMZsUsyto7CtBJgcJZIiBSN+IC2/aD0GcfYftU' }
所以当然,我收到一个关于 express.sid 未定义的错误。当我将 express.sid 更改为 connect.sid 时,我的会话变量是未定义的。
我真的在努力解决这个问题 - 我已经工作了几个小时。有什么帮助吗?
编辑:总结一下我已解决的问题:
- 在app.config中,我使用的是cookieSession而不是session。
- 我的客户端正在连接到服务器的端口转发的外部 IP 版本。这没有携带cookie数据。 .
- split('.')[0].substring(2) 在查找会话 ID 时是绝对必要的。
- 在 io.set('authorization, function (handshake,callback) 的末尾,您必须调用 "callback(null,true)" 才能使 socket.io 连接正常进行。
你已经很接近了。实际上,在将 cookie 传递给解析器之前,您不需要修改它。
io.set('authorization', function(handshake, callback) {
handshake.cookie = cookie.parse(handshake.headers.cookie);
handshake.sessionID = connect.utils.parseSignedCookie(handshake.cookie['express.sid'], conf.sessionSecret);
sessionStore.get(handshake.sessionID, function(err, session) {
// the session would be here
});
});
但是,由于您可以访问cookie解析器中间件,因此我个人会这样做:
var parseCookie = express.cookieParser(conf.sessionSecret);
io.set('authorization', function(handshake, callback) {
if (handshake.headers.cookie) {
parseCookie(handshake, null, function(err) {
handshake.sessionID = handshake.signedCookies['express.sid'];
sessionStore.get(handshake.sessionID, function(err, session) {
// the session would be here
});
});
}
});
此方法收集在解析 cookie 期间可能出现的任何错误,并通过传递 handshake
对象(就好像它是 HTTP 请求对象一样)来工作,因为它们都具有 headers.cookie
属性。然后,cookie 解析器将解析 cookie 并将它们分配给 handshake
对象,因此您可以从 handshake.signedCookies
中找到会话 ID。