2012-01-14 63 views
1

我使用express和socket.io。Express - socket.io - 读取会话

当您创建一个与快递职位的会议。点击按钮并使用Ajax和POST方法(登录),我保存一个会话。

app.post('/login', function(req, res){ 
     req.session.loginid = req.body.lgnid; 
    }); 

在socket.io中无法读取。

感谢您的意见。

我的源代码:

var express = require('express'); 
var app = express.createServer(); 
var io = require('socket.io').listen(app); 
var MemoryStore = express.session.MemoryStore; 
var sessionStore = new MemoryStore(); 
var parseCookie = require('connect').utils.parseCookie; 
var Session = require('connect').middleware.session.Session; 
var stylus = require('stylus'); 
    app.use(express.bodyParser()); 
    app.use(express.cookieParser()); 
    app.use(express.session({store: sessionStore 
     , secret: 'secret' 
     , key: 'express.sid'})); 

    app.use(stylus.middleware({ src: __dirname + '/public', compile: compile })) 
    app.use(express.static(__dirname + '/public')); 
    app.set('views', __dirname); 

// disable layout 
    app.set("view options", {layout: false}); 

    // make a custom html template 
    app.register('.html', { 
    compile: function(str, options){ 
     return function(locals){ 
     return str; 
     }; 
    } 
    }); 

    function compile (str, path) { 
    return stylus(str) 
     .set('filename', path) 
     .use(nib()); 
    }; 

var Session = require('connect').middleware.session.Session; 
sio.set('authorization', function (data, accept) { 
    if (data.headers.cookie) { 
     data.cookie = parseCookie(data.headers.cookie); 
     data.sessionID = data.cookie['express.sid']; 
     // save the session store to the data object 
     // (as required by the Session constructor) 
     data.sessionStore = sessionStore; 
     sessionStore.get(data.sessionID, function (err, session) { 
      if (err || !session) { 
       accept('Error', false); 
      } else { 
       // create a session object, passing data as request and our 
       // just acquired session data 
       data.session = new Session(data, session); 
       accept(null, true); 
      } 
     }); 
    } else { 
     return accept('No cookie transmitted.', false); 
    } 
}); 

如何加载和保存sessionStore数据?

io.sockets.on('connection', function (socket) { 

    var hs = socket.handshake; 
    console.log('Session : ' + hs.session.loginid + '); //Session : undefined 

}); 

回答

5

推荐的方式来真正实现这一点(在我的经验,至少)是放弃sessionStore.get功能并为sessionStore.load代替 - 所不同的是,随着负载的回调给予一个会话实例,而不是具有自己创造一个。所不同的仅仅是把你的代码片段:

sessionStore.get(data.sessionID, function (err, session) { 
    if (err || !session) { 
     accept('Error', false); 
    } else { 
     // create a session object, passing data as request and our 
     // just acquired session data 
     data.session = new Session(data, session); 
     accept(null, true); 
    } 
}); 

而且将其更改为:

sessionStore.load(data.sessionID, function(err, session) { 
    if (err || !session) { 
    accept("Error", false); 
    } else { 
    data.session = session; 
    accept(null, true); 
    } 
}); 

从那里,你应该打交道时能够但是当你试图访问会话,如socket.handshake.session,如果您在套接字事件中进行了更改,则必须自行手动保存会话。如果您添加/删除的东西,您必须:session.save([callback])

我意识到这不是一个很大的答案,因为我告诉你做大致你已经是,但这是现在与我快速2.5.8和Socket.IO 0.9.6