Javascript 合并socket.io和express.js会话

Javascript 合并socket.io和express.js会话,javascript,session,express,socket.io,Javascript,Session,Express,Socket.io,我想将express.js和socket.io会话合并在一起。下面是我的代码(socket.io部分) My express.js会话设置: app.configure(function() { //app.use(express.logger()); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.static(__dirname + '/static'));

我想将express.js和socket.io会话合并在一起。下面是我的代码(socket.io部分)

My express.js会话设置:

app.configure(function() {
  //app.use(express.logger());
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.static(__dirname + '/static'));
  app.use(express.cookieParser());
  app.use(express.session({store: MemStore({
    reapInterval: 60000 * 10
  }), secret:'foobar', key: 'express.sid'
}));
我的主要问题是在我的终端上,当用户从一个url移动到另一个url时,会话id也会改变:但我不希望它被改变

info  - socket.io started
client connected
client connected
4Z0bYHzfWCEFzbbe4WUK disconnected
e_uSvxhSLbLAC9-F4WUL disconnected
client connected
bKDy90gsrWWTRJDD4WUM disconnected
client connected
RJ5qqCL2wfmXbd7U4WUN disconnected
client connected
wjN5Sqx4rucRtWL_4WUO disconnected

您正在从express.js输出套接字ID,而不是会话ID

您必须使用
authorization
事件,它的第一个参数是一个对象,该对象有一个名为
sessionID
的条目。该值不应在页面重新加载之间更改,因为它存储在cookie(或redis数据库或其他)中

这里有一篇很好的文章解释了它的工作原理:,但它有点过时。基本原则不变,但一些细节有所改变。例如,他创建服务器的方式不再有效,connect开发人员已经删除了
parseCookie()
。用户同意这一决定,但解决办法是这样一行易于记忆的代码:

connect.utils.parseSignedCookies(cookie.parse(decodeURIComponent(data.headers.cookie)), secret);
正如我所说的,上面提到的文章应该为您提供所需的所有基础知识,如果您希望看到一个有效的实现,请查看以下内容:

授权
事件处理程序中,您可以修改
数据
对象,然后使用
socket.handshake
,在您的情况下:
socket.handshake.sessionID


希望对您有所帮助。

@Alex如果您克隆了
lolbr
,请确保在其下方安装了
express
。只需克隆,然后将
cd
插入其中,然后键入
npm install
。这应该行得通。所以,parseSignedCookies现在不可用。您建议如何重新编写代码?我不熟悉socket.io中的Cookies,但我找到了“var Cookies=cookie.parse('foo=bar;cat=meow;dog=ruff');”示例。我应该如何在这个示例中实现它?为什么
parseSignedCookies
首先不可用?您的意思是说它在node.js环境中不可用吗?请尝试将
connect=require('express/node\u modules/connect')
替换为
connect=require('connect')
。现在我正在考虑这个问题。。。。为什么不将cookies的存储和套接字的存储设置为同一个存储?
connect.utils.parseSignedCookies(cookie.parse(decodeURIComponent(data.headers.cookie)), secret);