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

标签 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并应用了它...但我的 session 在我的套接字中始终为空。

这是我所拥有的。

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) { ...

session 始终为空...即使我的 Passport 已正确加载我的 session 。

想法?

最佳答案

好吧,为了子孙后代,我是这样做来解决这个问题的。

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

经过更多研究,我发现我需要确保我获得了 Passport session ,因为这就是我的身份验证。

我发现了这个小 gem :https://github.com/jfromaniello/passport.socketio

这就像一个魅力。唯一需要花一些时间弄清楚的是正确设置 key (他们假设您知道如何在示例中做到这一点)。

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

开箱即用,您的 key 尚未设置。为此,只需使用您的应用程序进行设置,如下所示:

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

希望这对某人有帮助。

大卫

关于Node.js - 试图避免全局变量...我如何跟踪用户对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16204679/

相关文章:

javascript - NodeJS/Express : How to get enctype of submitted form?

node.js - 无法使用 Node 运行服务器

cookies - 如何在 Postman 中存储和重用 cookie?

node.js - 我可以让我的 nodejs/express/jade 堆栈报告合理的语法错误吗?

javascript - 测量 node.js http 请求的时间

javascript - react 组件DidMount "Parsing error: Missing semicolon"

javascript - Nodejs后台运行函数

node.js - Nodejs Vertica 以 json 形式返回查询

javascript - 使 JSON Web token 失效

android - 如何在 ANDROID 的 HttpURLConnection 中使用 Cookie?