我在NodeJs脚本上面的会话中保存了一些问题。如果我启动脚本并像这样进行帖子登录:
app.post('/login', function(req, res) {
sess = req.session;
sess.key = "SecureKEy";
console.log(sess);
});
我得到了我想要的东西:
会话{ 曲奇饼: {路径:'/', _expires:null, originalMaxAge:null, httpOnly:true}, key:'SecureKEy'}
但如果我使用此代码重新加载页面,则session.key为空。就像没有保存一样。
app.get('/', function(req, res) {
sess = req.session;
console.log(sess);
res.sendFile(__dirname+'/wwwroot/index.html');
});
我对快递会议的配置如下:
const session = require('express-session');
app.use(session({
secret: 'importent',
resave: true,
saveUninitialized: true
}));
答案 0 :(得分:1)
对于GET请求,服务器假定您将重新发送数据,并在路由完全处理后自动保存会话数据。
对于POST请求(我正在使用的),但是,没有做出同样的假设。会话状态仅保存在以下两种情况之一 - 数据发送时(通过res.send,res.redirect等),或者手动调用req.session.save()。我已经从AJAX请求中调用/登录了,如果满足某些条件,我就不会返回任何内容。在设置会话变量后,让服务器使用某些数据响应客户端。
答案 1 :(得分:0)
我已经重写了这样的代码:
app.post('/login', function(req, res) {
console.log("Before: ");
console.log(sess);
sess = req.session;
sess.key = "SecureKEy";
req.session.save();
console.log("After: ");
console.log(sess);
});
使用它可以正常工作。但是如果我用res.send重新发送登录页面会自动保存会话?这是对的吗?
答案 2 :(得分:0)
express-session 自动保存边缘情况?
对于某些快速响应传输方法,肯定不会触发快速会话save(...)
方法。对于response.send(...)
,response.json(...)
等经常遇到的事件,似乎总是会触发。
但是对于特殊情况传输方法(例如express.response.end()
方法)却并非如此-至少从我的观察来看;以及response.sendFile(...)
(根据OP)和response.redirect(...)
(根据其他地方的帖子)。
为避免意外问题,将快速会话应用于使用特殊情况响应传输方法的请求时,请密切注意。 可能必须直接调用express-session save(...)
方法以持久保留在这些请求期间所做的更改。即使这样,也不能保证持久性。
例如,在某些情况下,将值设置为null和/或调用session.destroy(...)
和/或session.regenerate(...)
方法无效。那些被破坏的会话数据基本上会在下一页刷新时重新出现。甚至没有调用save(...)
方法或将unset
选项设置为'destroy'
都无法解决这种情况。
快速会话自述文件应该在页面顶部的 Note 部分之一中包含这些极端情况。
这将抑制围绕其 自动保存 功能的一些不利因素。我对这类事情的看法是:当一个软件包对于用例而言过于古怪时,要么找到一个更合适的软件包,要么尽可能地寻求自己的解决方案。解决方法倾向于扭曲应用程序逻辑,从而使其易于出错,并且随着时间的推移难以维护。