因此,出于学习目的,我正在使用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
}
}
这不包含添加的数据。我的猜测是,这是我的应用程序启动时的会话,在我执行登录之前,因此在将任何数据添加到会话之前。
不幸的是,我对如何进行感到茫然。我很感激任何建议:)
答案 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}很重要,例如休息代码。
感谢。