express-session无法检索会话变量



我正在使用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});
从上面的代码中可以看到,会话变量持久化地存储用户对象,用户对象确实保存在mongodb数据库中,,但显然没有被检索到。

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未定义,以及request .session.user对象。

是我能够从请求中检索到的唯一数据。会话变量为:

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
}}))

最新更新