Node.js - 试图避免全局...我如何跟踪用户对象?

时间:2013-04-25 00:53:51

标签: node.js express session-cookies passport.js

好的,这就是场景。我让用户使用facebook登录我的应用程序。发生这种情况时,Passport会将其保存到Session(req.user)。当我在一个可以访问请求对象的页面中工作时,这一切都很好,但我发现自己处于无法访问请求的情况,但我需要检查用户对象。

例证。我正在使用socket.io,当我使用套接字及其周围的方法时,我无法访问请求对象,因此无法获取用户信息。

我一直听说我需要尽可能远离全局,但我看不到它的方法。

思想?

以下是我使用套接字的示例。从我的server.js文件中调用该模块。

function loadSockets(io)
{
    var articleCommand = require('./middleware/ArticleCommand');

    io.sockets.on('connection', function (socket) {
        socket.on('getArticles', function(){
            if (NEED USER INFO HERE !== null){
                articleCommand.getArticlesByUser(NEED USER INFO HERE, function(error, articles){
                    io.sockets.emit('articlesRetrieved', error, articles);
                });
            }
        });
    });
}

exports.loadSockets = loadSockets;

更新

好的,基于评论者的建议,我已经安装了这个:https://github.com/aviddiviner/Socket.IO-sessions并应用了它......但我的会话在我的套接字中始终为空。

这就是我所拥有的。

var socket = sio.enable({
    socket: io.listen(server, {'log level': 1, 'heartbeat': false}),   
    store:  mystore,                // this is my Redis store
    parser: express.cookieParser()
});

稍后......处理我的套接字时

socket.sockets.on('connection', function (socket, session) { ...

会话始终为空...即使我的护照已正确加载我的会话。

思想?

1 个答案:

答案 0 :(得分:0)

好的,为了后人的缘故,这就是我为解决这个问题所采取的措施。

您可以从上面的更新中看到我尝试使用SocketIO会话模块,但这不起作用。

经过更多研究后,我发现我需要确保自己获得护照会议,因为这是我的身份验证。

我找到了这个小宝石:https://github.com/jfromaniello/passport.socketio

这就像一个魅力。解决问题的唯一方法是正确设置密钥(他们假设您知道如何在示例中执行此操作)。

sio.set("authorization", passportSocketIo.authorize({
    key:    'MYKEY',       
    secret: 'SECRET',
    store:   mySessionStore
}));

开箱即用,您的密钥未设置。要做到这一点,只需使用您的应用程序进行设置:

app.use(express.session({
    secret: "SECRET",
    store: mySessionStore,
    key: 'MYKEY',
    cookie: { secure: false, maxAge:86400000 }
}));

希望这有助于某人。

大卫