【问题标题】:Node.js - Trying to avoid globals...how do I keep track of a user object?Node.js - 试图避免全局变量......我如何跟踪用户对象?
【发布时间】:2013-04-18 18:04:31
【问题描述】:

好的,这就是场景。我让用户使用 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) { ...

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

想法?

【问题讨论】:

  • stackoverflow.com/a/4755045/266795 您还应该考虑将范围限定为会话(用户)的内容并将其设为全局并不能神奇地解决您的问题。现在,您的应用程序将使用户在会话中纵横交错,并出现灾难性的不当行为(向最终用户显示错误的数据)。
  • @PeterLyons 好的,我完全同意我需要远离全局变量...但是我该怎么做呢?在我上面描述的场景中,我如何获取用户信息?
  • 您阅读我链接的答案了吗?您可以从 socket.io 请求标头中获取会话 cookie,并使用它来查找相应的会话对象并以这种方式访问​​用户。
  • @PeterLyons 是的,我确实阅读了该内容并按照说明操作...查看我的更新。

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


【解决方案1】:

好的,为了子孙后代,这就是我为解决此问题所做的工作。

您可以从我上面的更新中看到,我尝试使用 SocketIO-sessions 模块,但没有成功。

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

我发现了这个小宝石: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 }
}));

希望这对某人有所帮助。

大卫

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-19
    • 2016-03-19
    • 2012-02-02
    • 2015-12-26
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多