Node.js 数据头中未显示快速cookieSession键

Node.js 数据头中未显示快速cookieSession键,node.js,session,express,connect,socket.io,Node.js,Session,Express,Connect,Socket.io,我试图解决访问socket.io中的会话变量这一臭名昭著的问题。我基本上已经阅读了谷歌上关于这个话题的每一个链接,我仍然在努力 在完成所有的路由之后,我有以下几点: io.set('authorization', function(data,accept) { data.cookie = cookie.parse(data.headers.cookie); ---> console.log(data.cookie); data.sessionID = connect

我试图解决访问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);
    });
});
不幸的是,我画了一个箭头的console.log返回以下内容:

{ 'connect.sid': 's:3pIi31DPthO8KVOjqzYpeL75.nHvKOpMZsUsyto7CtBJgcJZIiBSN+IC2/aD0GcfYftU' }
当然,我得到了一个关于express.sid未定义的错误。 将express.sid更改为connect.sid时,会话变量未定义

我真的在努力解决这个问题——我已经做了几个小时了。有什么帮助吗

编辑: 总结我已解决的问题:

  • 在app.config中,我使用了cookieSession而不是会话
  • 我的客户端正在连接到服务器的一个端口转发的外部ip版本。这没有携带cookie数据
  • .split('.')[0]。查找sessionID时,子字符串(2)是绝对必要的
  • 在io.set的末尾('授权、函数(握手、回调)…必须调用“回调(null、true)”,以便socket.io连接正常进行

  • 很接近了。实际上,在将cookie传递给解析器之前,不需要修改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解析过程中可能出现的任何错误,并将
    握手
    对象作为HTTP请求对象传递,因为它们都具有
    头.cookie
    属性。cookie解析器随后将解析cookie并将其分配给
    握手
    对象,因此然后,您可以从
    握手中找到会话ID。signedCookies

    您已经非常接近了。实际上,在将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解析过程中可能出现的任何错误,并将
    握手
    对象作为HTTP请求对象传递,因为它们都具有
    头.cookie
    属性。cookie解析器随后将解析cookie并将其分配给
    握手
    对象,因此然后,您可以从
    handshake.signedCookies

    中找到会话ID。啊,是的,删除
    标题。cookie
    部分。对于错误,很抱歉,我们还将编辑示例。handshake.signedCookies为空。您知道为什么会是这样吗?会话中间件的设置和完整授权代码。更新了我的原始帖子。谢谢谢谢你的帮助。啊,是的,删除
    标题。cookie
    部分。很抱歉,我们也会编辑示例。handshake.signedCookies是空的。你知道为什么会这样吗?会话中间件的设置和完整的授权码。更新了我的原始帖子。非常感谢你的帮助。