从socket.io检索时,会话属性不保存在会话存储中

时间:2014-07-20 05:17:21

标签: express socket.io passport.js

我想要完成的是将当前用户的用户名存储在会话中,以便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中的会话(从会话存储中检索到的)不会镜像路由器中对会话所做的最新更改。

如果有人有任何建议或原因,我希望看到的不正确,我会很高兴听到他们的声音!

1 个答案:

答案 0 :(得分:0)

会话范围是专用客户端浏览器选项卡与服务器之间的连接。

由于您没有解释为什么要在会话中存储用户名,我的答案仅基于猜测:

  1. 如果您想记住用户名以供以后在会话中使用,请将其存储在客户端。
  2. 如果要向通信空间中的其他用户声明用户名(和其他变量),最简单的方法是将数据存储在数据库中(请注意,数据库可以在内存中,这可以解决快点)。你也可以使用文件 - 但如果你运行mutliple用户,你将不得不切换到数据库......
  3. 无论如何,不​​需要在多个客户端上扩展会话的范围。