2014-07-22 75 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];