【发布时间】:2014-09-10 22:14:30
【问题描述】:
我想要完成的是将当前用户的用户名存储在会话中,以便可以通过 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 中的会话(从会话存储中检索)没有反映路由器中对会话所做的最新更改。
如果有人有任何建议,或者我期望看到的内容不正确的原因,我会很高兴听到他们的意见!
【问题讨论】:
标签: express socket.io passport.js