【问题标题】:Node: How do I store data in an express session, so that I can access it from socket.io?节点:如何在快速会话中存储数据,以便可以从 socket.io 访问它?
【发布时间】:2015-04-07 18:42:21
【问题描述】:

因此,出于学习目的,我正在使用 Node 和 Express 编写一个聊天应用程序。我使用 MongoDB/Mongoose、Passport 进行身份验证,并将 socket.io 用于应用程序的实际聊天部分。

我有一个有效的注册/登录/注销系统。我的问题出在 socket.io 代码中。当我从客户端发出消息时,我想在服务器端代码中知道消息来自哪个用户。因此,例如在 PHP 中,我会在登录时将用户名保存在会话变量中,然后从其他地方使用它。所以我尝试在这里做类似的事情:

router.post('/',
    passport.authenticate('local',{ failureRedirect: '/login', failureFlash: true }),
    function(req, res) {
        User.findOneAndUpdate({_id: req.user._id}, { lastConnection: new Date() }, {} ,function (err, user) {
            req.flash('welcomeMessage', 'Welcome ' + user.name + '!');
            req.session.user=user.name;         //Here I try saving the user name
            req.session.cookie.user=user.name;  //Same here, for testing purposes
            res.redirect('/');
        });
    });

但是我如何从 socket.io 中访问这些数据呢?在另一个 Stackoverflow 问题中,有人提供了以下代码,用于将 express 会话公开给 socket.io:

io.use(function(socket, next) {
    var req = socket.handshake;
    var res = {};
    cookieParser(req, res, function(err) {
        if (err) return next(err);
        session(req, res, next);
    });
});

这允许我访问会话:

io.sockets.on('connection', function (socket) {
    //Express session:
    console.log("Session: ", socket.handshake.session);

这给了我这个输出:

Session: {cookie:
    { path: '/',
      _expires: null,
      originalMaxAge: null,
      httpOnly: true
    }
}

这不包含添加的数据。我的猜测是,这是我的应用程序启动时的会话,在我执行登录之前,因此在任何数据添加到会话之前。

不幸的是,我不知道如何继续。我很感激任何建议:)

【问题讨论】:

  • 正如我所提到的,我帖子中的一些代码位来自那个问题。我在我的帖子中进一步解释了为什么这不能解决我的问题......

标签: node.js session express socket.io passport.js


【解决方案1】:

在您的会话初始化中,将默认 httpOnly: false 设置更改为 true。

既然是严格的httpOnly,就是拒绝AJAX请求。

在您正在初始化 Session 的 app.js 或 server.js 中执行类似的操作。

var session = expressSession({ secret: 'secret key', key: 'express.sid', resave: false, saveUninitialized: true, cookie: {httpOnly: false} });

注意:cookie: { httpOnly: false } 很重要,例如rest code。

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-10
    • 2020-04-16
    • 2012-05-05
    • 2012-01-23
    • 1970-01-01
    • 2014-04-30
    • 2014-06-14
    • 2013-08-30
    相关资源
    最近更新 更多