简体   繁体   English

快速会话无法检索会话变量

[英]express-session unable to retrieve session variable

I am using express-session to store my sessions persistently on a MongoDB database.我正在使用 express-session 将我的会话持久地存储在 MongoDB 数据库中。

The project worked perfectly in a development environment but for some reasons the session variable saved in case of successful login is not sent to the front-end (it's undefined) in a production envirornment:该项目在开发环境中运行良好,但由于某些原因,在成功登录的情况下保存的会话变量未发送到生产环境中的前端(未定义):

server.js [backend] 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 [backend] login_controller.js [后端]

                                req.session.isLogged =true;
                                req.session.user = user;
                                req.session.save()
                                res.json({success:true});

As you can see from the code above session variable stores the user object persistently, the user object does get saved in the MONGO database , but it does not get retrieved apparently.从上面的代码中可以看出,会话变量持久地存储了用户对象,用户对象确实保存在 MONGO 数据库中,但显然没有被检索到。

get_user_frontend [ frontend ] get_user_frontend [前端]

fetch('https://backend-server/get_user',{
credentials:'include',

}) })

get_user_controller.js [backend] 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)}

The above middleware is responsible for sending user data at every frontend call, but for some reason res.session.isLogged is undefined, as well as the req.session.user object.上述中间件负责在每次前端调用时发送用户数据,但由于某种原因 res.session.isLogged 以及 req.session.user 对象未定义。

the only data I am able to retrieve from the req.session variable is:我能够从 req.session 变量中检索的唯一数据是:

cookie: {originalMaxAge: 604800000, expires: '2022-05-14T07:56:24.626Z', httpOnly: true, 
path: '/'}

While in the MongoDB database data is stored correctly:虽然在 MongoDB 数据库中数据被正确存储:

_id:"LfoXW1yf_E8gLMyMLtlesuBVevVAJjm9"
expires:2022-05-13T09:05:59.386+00:00
session:Object
cookie:Object
isLogged:true
user:Object

I fail to understand why the session variable does not persist in the backend, even if it get stored in the database correctly.我不明白为什么会话变量不会在后端持久存在,即使它正确存储在数据库中。

I actually solved the problem making the following changes in the express-session cookie configuration:我实际上解决了在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM