我正在使用带内存存储的基本节点快速会话设置,我在服务器上有这个代码:
app.use(require('express-session')({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
cookie: { secure: true }
}));
app.post('/api/logIn', function(req, res) {
req.session.userName = req.body.userName;
}
app.get('/api/getProfile', function(req, res) {
User.findOne({'userName' : req.session.userName},
function (err, userProfile) {
console.log('getProfile executed for user:' + req.session.userName);
if (err) throw err;
console.log(userProfile);
});
});
问题是来自getProfile路由的 req.session.userName 是未定义的,尽管它不在之前的logIn路由请求中。我检查了HTTP标头,奇怪的是没有从服务器或客户端处理cookie的标头。现在我不知道可能是什么问题。
答案 0 :(得分:3)
您说cookie: { secure: true }
,但您的网络服务器实际上是否在安全连接上?如果没有,则不会写入cookie。
来自docs:
请注意,secure:true是推荐选项。但是,它 需要启用https的网站,即HTTPS是安全所必需的 饼干。如果设置了安全性,并且您通过HTTP访问您的站点,则 cookie将不会被设置。
答案 1 :(得分:1)
还要特别注意是否使用fetch()
进行API调用,以将{ credentials: 'include' }
包括在fetch()
调用的选项中。否则,cookie将无法正确设置,并且您的会话将不会持续。确保在服务器端执行以下操作:
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Credentials', true);
next();
});
,以便您的标头设置正确,并且cors不会成为问题。花了我一段时间才弄清楚这个问题,但现在可以正常工作!
答案 2 :(得分:0)
会话需求存储在cookie中,因此我们使用它来解析它,如下所示:
var cookieParser = require('cookie-parser');
// must use cookieParser before expressSession
app.use(cookieParser());