【发布时间】: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