快速会话中的 req.session 不持久

Posted

技术标签:

【中文标题】快速会话中的 req.session 不持久【英文标题】:req.session in express-session not persisting 【发布时间】:2016-05-06 02:56:04 【问题描述】:

我有以下代码:

var express = require('express');
var cookieParser = require('cookie-parser');
var http = require('http')
var app = express();
app.use(cookieParser());
var session = require('express-session');
app.use(session(
    resave: false,
    saveUninitialized: true,
    secret: 'sdlfjljrowuroweu',
    cookie:  secure: true 
));

app.get('/test', test);
function test(req, res) 
    var sess = req.session;
    console.log('before', sess);
    if (sess.views) 
        sess.views++
        req.session.save();
        res.setHeader('Content-Type', 'text/html')
        res.write('<p>views: ' + sess.views + '</p>')
        res.write('<p>expires in: ' + (sess.cookie.maxAge / 1000) + 's</p>')
        res.end();
     else 
        sess.views = 1;
        req.session.save();
        res.end('welcome to the session demo. refresh!')
    
    console.log('after', sess);
    return;


var server = http.createServer(app);
server.listen(8181);

然后重新加载页面,我只是不断收到视图计数为 0 的消息。

检查控制台,每次都是这样的输出:

before  cookie: 
    path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true,
     secure: true  
after  cookie: 
    path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true,
     secure: true ,
  views: 1 

所以它似乎根本没有节省

【问题讨论】:

您使用的是安全连接吗?又名https://,我怀疑你不是,但你在express.session(...) 中将secure 标志设置为true,这意味着你将永远无法访问cookie(因此会话将无法正常工作)。 【参考方案1】:

cookie: secure: true 更改为cookie: secure: false

使用 secure 标志意味着 cookie 将仅设置在 Https 上。

【讨论】:

感谢您将我的评论复制到答案中。 我没有看到你的评论 是的,这就是原因。谢谢你们! 谢谢!!几天来同样的问题 这确实是问题所在,但是可以实现cookie: secure: app.get('env') === 'production' ,这样只有在应用上线时才需要 SSL。

以上是关于快速会话中的 req.session 不持久的主要内容,如果未能解决你的问题,请参考以下文章

从另一个端点检索时,使用 express-session 保存到 req.session 的数据为空

没有 req.session.save() 会话不会保存在 Node.js 中

express req.session 对象是如何持久化的?

如何在渲染html页面中检索nodejs会话值?

如何在 ExpressJS 中结束会话

节点客户端会话与快速会话