无法从会话存储中获取会话

时间:2014-07-22 12:16:14

标签: node.js session express socket.io socket.io-1.0

我已经阅读并复制了很多关于使用socket.io,express和会话存储的会话的例子。但是,每次拨打sessionStore.get()(或sessionStore.load())时,我都会回复undefined。为什么呢?

这是我的代码(简化):

var app = require('express')(),
    session = require('session'),    
    MongoStore = require('connect-mongostore')(session);

app.use(session({
    store: new MongoStore({ 'db': 'sessions' });
}));

io.use(function(socket, next) {
    var req = socket.request,
        reqCookie = cookie.parse(req.headers.cookie),
        sessid = reqCookie['connect.sid']; // == actual session ID

    sessionStore.get(sessid, function(err, session) {
        err // == undefined
        session // == undefined
    });
    next() ;
});

我还尝试使用session.MemoryStore代替connect-mongostore,结果相同。我修改了 node_modules/express-session/session/memory.js尝试注销sessionStore中的会话:

MemoryStore.prototype.get = function(sid, fn){
  var self = this;    
  console.log(self.sessions); // Output: {}

对于会议等我来说,我是一个新手,所以,谢谢你对我的支持。

更新:我在两个不同的系统和网络上尝试过代码,但我仍然得到相同的结果。

1 个答案:

答案 0 :(得分:3)

所以我终于想出了如何解决这个问题。事实证明,从套接字ios socket.request.headers.cookie返回的会话ID与从nodejs'req.sessionID返回的会话ID不完全相同。

以下是我在两种情况下获取会话ID的方法,以及它们返回的示例。

正常的http请求

app.get('/', function(req, res) {
    req.sessionID; // == LMKJxTssmDgf8IxwijbC9G6LtDBuTQWX

});

Socket.io

io.use(function(socket, next) {

    var req = socket.request;

    if (req.headers.cookie) {
        req.cookie = cookie.parse(req.headers.cookie);

        req.cookie['express.sid']; // == s:LMKJxTssmDgf8IxwijbC9G6LtDBuTQWX.ApVkBxAEf4o3Pdgo0PWDRHi+GvBaSdcK7q1pO4xslZ0

正如您所看到的,会话ID在两种情况下都存在,我们只需删除一个socket.io给我们的东西。 解决方案: req.cookie['express.sid'].split('.')[0].split(':')[1];

相关问题