我想要完成的是将当前用户的用户名存储在会话中,以便socket.io可以检索它。
目前,我让客户端将其sessionId发送到socket.io端点(通过io.connect):
var socket = io.connect('http://localhost?sessionId=' + sessionid);
然后在服务器端,我有:
io.use(function(socket, callback) {
if (socket && socket.handshake && socket.handshake.query && socket.handshake.query.sessionId) {
var sessionId = socket.handshake.query.sessionId;
sessionStore.get(sessionId, function(error, session) {
socket.handshake.sessionId = sessionId;
if (error) {
callback('Could not set session id with socket io authorization handshake!', false);
} else if (!session) {
callback('There was no session found during socket io authorization handshake!', false);
}
console.log(session);
socket.session = session;
callback(null, true);
});
} else {
callback('No sessionId value was provided in query string to socket io connect from client', false);
}
});
这正确地从客户端提供的sessionid中检索会话(当然,假设id存在)。
现在,我想做的是能够通过会话从socketio处理程序中访问passportjs管理的用户名。
因此,首先,我在路由器控制器中为此端点提供了此代码:
router.get('/', Authentication.redirectIfNotAuthenticated, function(req, res) {
req.session.user = req.user;
console.log(req.session);
res.locals.sessionId = req.session.id;
res.render('mypage', { title: 'This is my page', user: req.user });
});
console.log(req.session)
确实向我显示req.user已正确插入会话对象并且可见。 Authentication.redirectIfNotAuthenticated正在使用passportjs并且非常简单(代码包括在内就是问题):
redirectIfNotAuthenticated : function(req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.redirect('/');
}
所以...我们知道用户正在作为属性插入会话对象...但是当我点击我的一个socketio方法时:
socket.on('init', function(info) {
console.log(socket.session);
...
});
那 console.log(socket.session)
没有显示我在路线中修改的会话,但显示了“原始”会话对象 - 好像我从来没有添加任何内容!我知道socket.on('init'...
正在我的io.use(function....
代码之后被调用,如上所述(会话从sessionStore中提取并保存在套接字对象中)。
我只是无法找到存储在socket.session中的会话(从会话存储中检索到的)不会镜像路由器中对会话所做的最新更改。
如果有人有任何建议或原因,我希望看到的不正确,我会很高兴听到他们的声音!
答案 0 :(得分:0)
会话范围是专用客户端浏览器选项卡与服务器之间的连接。
由于您没有解释为什么要在会话中存储用户名,我的答案仅基于猜测:
无论如何,不需要在多个客户端上扩展会话的范围。