NodeJs express-session不保存会话

时间:2018-01-21 13:57:15

标签: javascript node.js express session

我在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
}));

3 个答案:

答案 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 部分之一中包含这些极端情况。

这将抑制围绕其 自动保存 功能的一些不利因素。

我对这类事情的看法是:当一个软件包对于用例而言过于古怪时,要么找到一个更合适的软件包,要么尽可能地寻求自己的解决方案。解决方法倾向于扭曲应用程序逻辑,从而使其易于出错,并且随着时间的推移难以维护。