2014-07-22 44 views
3

我已阅读并复制了有关使用与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() ; 
}); 

我也是在connect-mongostore代替试图与session.MemoryStore,具有相同的结果。我修改 node_modules/express-session/session/memory.js尝试在sessionStore注销会话:

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

我是个新手,当谈到会和这样的,所以谢谢你陪我的轴承。

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

回答

3

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

下面是我在两种情况下获取会话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出现在这两种情况下,我们只需要删除一个插座上的一些东西。 io给我们。 解决方案:req.cookie['express.sid'].split('.')[0].split(':')[1];