2014-07-22 4 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과 노력, 같은 결과 :

여기 (간체) 내 코드입니다. 그래서 나와 함께 베어링 주셔서 감사합니다, 그것은 세션과 같은에 올 때 나는 안돼서

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

: 나는 시도하고 sessionStore에서 세션을 로그 아웃 node_modules/express-session/session/memory.js를 수정했습니다.

업데이트 : 두 시스템과 네트워크에서 코드를 시도했지만 여전히 동일한 결과가 나타납니다.

답변

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가 두 경우 모두가, 우리는 단지 하나의 소켓에 몇 가지 물건을 삭제해야합니다. io가 우리에게 제공합니다. 솔루션 :req.cookie['express.sid'].split('.')[0].split(':')[1];.

관련 문제