在数据标题中不显示cookieSession密钥

我试图解决在socket.io中访问会话variables的臭名昭着的问题。 我基本上已经阅读过谷歌关于这个话题的每一个链接,而且我还在挣扎。

毕竟我的路由我有这个:

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时,我的会话variables未定义。

我真的很努力地解决这个问题 – 我已经在这里待了几个小时。 任何帮助?

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

  1. 在app.config中,我使用cookieSession而不是会话
  2. 我的客户端连接到我的服务器的端口转发的外部ip版本。 这不包含cookie数据。
  3. .split('。')[0] .substring(2)在查找sessionID时是绝对必要的
  4. 在io.set('authorization,function(handshake,callback)…必须调用“callback(null,true)”)的结尾,以便socket.io连接正常进行

你很近 在传递给parsing器之前,实际上并不需要修改它。

 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 }); }); 

但是,由于您可以访问cookieparsing器中间件,所以我个人会这样做:

 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 }); }); } }); 

这种方法收集在parsingcookie的过程中可能出现的任何错误,并且通过将handshake对象作为HTTP请求对象进行传递,因为它们都具有headers.cookie属性。 然后,cookieparsing器将parsingcookie并将其分配给handshake对象,以便您可以从handshake.signedCookiesfind会话ID。