节点:如何在快速会话中存储数据,以便我可以从socket.io访问它?

时间:2015-02-07 18:33:12

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

因此,出于学习目的,我正在使用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问题中,有人提供了以下代码,用于将快速会话暴露给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
    }
}

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

不幸的是,我对如何进行感到茫然。我很感激任何建议:)

1 个答案:

答案 0 :(得分:-1)

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

因为严格的httpOnly它拒绝了AJAX请求。

在您的app.js或server.js中,您正在初始化Session,请执行以下操作。

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

注意:cookie:{httpOnly:false}很重要,例如休息代码。

感谢。