在express-session中,req.session无法持久化

21

我有如下代码:

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 }

所以似乎根本没有保存


12
你是否使用安全连接(即 https://)?我怀疑你没有,但是你在 express.session(...) 中将 secure 标志设置为 true,这意味着你将永远无法访问 cookie(因此会导致会话不能正常工作)。请注意修改。 - Ash
1个回答

49

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

使用secure标志意味着该Cookie仅在Https上设置。


2
感谢你把我的评论复制到答案中。 - Ash
5
我没有看到你的评论。 - doron aviguy
是的,那就是原因。谢谢你们两个! - RobKohr
谢谢!同样的问题已经困扰我好几天了。 - duatis
7
确实,这是一个问题,然而可以通过实现cookie: { secure: app.get('env') === 'production' }来仅在应用程序上线时需要SSL。 - Paul Razvan Berg
这个刚刚救了我的命cookie: { secure: process.env.NODE_ENV ? true : false, - buycanna.io

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接