[英]express-session unable to retrieve session variable
我正在使用 express-session 将我的会话持久地存储在 MongoDB 数据库中。
该项目在开发环境中运行良好,但由于某些原因,在成功登录的情况下保存的会话变量未发送到生产环境中的前端(未定义):
server.js [后端]
const express = require('express');
const app = express();
const controllers = require('./controllers/adminControllers');
const router = require('./router/adminRouter');
const bodyParser = require('body-parser');
const cors = require('cors');
const dotenv = require('dotenv').config()
const session = require('express-session');
const MongoDBStore = require('connect-mongodb-session')(session);
app.use(cors({
origin: 'http://localhost:3000',
optionsSuccessStatus: 200,
credentials:true
}))
var store = new MongoDBStore({
uri:process.env.MONGO,
collection:'mySessions'
})
store.on('error',function(error){
console.log('session error');
});
app.use(require('express-session')({
secret:'justasecret',
cookie:{maxAge:1000 * 60 *60 *24*7},
store:store,
resave:true,
saveUninitialized:true
}))
app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())
app.use((req,res,next)=>{
console.log(req.session);
next()
})
app.use('/', router);
app.listen(process.env.PORT || 3001);
login_controller.js [后端]
req.session.isLogged =true;
req.session.user = user;
req.session.save()
res.json({success:true});
从上面的代码中可以看出,会话变量持久地存储了用户对象,用户对象确实保存在 MONGO 数据库中,但显然没有被检索到。
get_user_frontend [前端]
fetch('https://backend-server/get_user',{
credentials:'include',
})
get_user_controller.js [后端]
exports.getUser = (req,res,next)=>{
if(req.session.isLogged===false){
return res.json({user:{isLogged:false}})
}return res.json(req.session)}
上述中间件负责在每次前端调用时发送用户数据,但由于某种原因 res.session.isLogged 以及 req.session.user 对象未定义。
我能够从 req.session 变量中检索的唯一数据是:
cookie: {originalMaxAge: 604800000, expires: '2022-05-14T07:56:24.626Z', httpOnly: true,
path: '/'}
虽然在 MongoDB 数据库中数据被正确存储:
_id:"LfoXW1yf_E8gLMyMLtlesuBVevVAJjm9"
expires:2022-05-13T09:05:59.386+00:00
session:Object
cookie:Object
isLogged:true
user:Object
我不明白为什么会话变量不会在后端持久存在,即使它正确存储在数据库中。
我实际上解决了在 express-session cookie 配置中进行以下更改的问题:
app.set("trust proxy", 1); //<--
app.use(session(
{
secret: 'iamjustasecret',
store: store,
maxAge:100000,
proxy:true, // <----
cookie: {
httpOnly:true,
sameSite: process.env.NODE_ENV === "production" ? 'none' : 'lax', //<--
secure: true
}}))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.