从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
。