从socket.iocallback中修改会话数据

我目前使用这个堆栈expres,socket.io,sessionstore。 我跟着这里的文章http://www.danielbaulig.de/socket-ioexpress/ 。 那么问题是,我不能修改socket.iocallback中的会话值。

从快捷方式访问效果很好,每次刷新后项目都会增加。

app.get('/mysession', function(req, res) { req.session.item++; console.log(req.session); res.render('session.jade', { title: 'Sample title' }); }); 

在socket.io方面使用它不,这里是问题,也许我设置了错误的对象。

 var io = io.listen(app); io.sockets.on('connection', function(socket) { var handshake = socket.handshake; onlineCount++; console.log('Well done id %s', handshake.sessionID); handshake.session.item++; console.log(handshake.session); }); 

这是桥码。

 io.set('authorization', function(data, accept) { if (data.headers.cookie) { data.cookie = parseCookie(data.headers.cookie); data.sessionID = data.cookie['express.sid']; sessionStore.get(data.sessionID, function(err, session) { if (err || !session) { accept('Error', false); } else { data.session = session; accept(null, true); } }); } else { return accept('No cookie tansmitted', false); } }); 

我发现做这个工作的唯一方法是从connect事件上的请求对象中获取cookie,用你最喜欢的cookieparsing器(我使用connect.utils.parseCookie )parsing它,并将其设置在该套接字上,以便我可以在未来的事件中访问它:

 socket.on('connection', function(client) { var cookie = client.request.headers.cookie; var pcookie = connect.utils.parseCookie(cookie); var session_id = pcookie["connect.sid"]; if (session_id) { sessionStore.get(session_id, function(err, sess) { // do whatever you want with sess here // ... // if you want to "save" the session for future events client.set('session_id', session_id); } } }); 

sessionStore API改变了一点,现在它的sessionStore.load(sessionId, cb)而不是.get