Express-session 在每次请求时创建新会话
Express-session creates new session every request
我将 node express 服务器投入生产。在开发中,express-session 运行良好(它使用 MemoryStore 将会话存储到 cookie 中)。但现在每次我刷新或发出请求时,它都会在 MongoStore 中创建一个新的会话 ID。此外,它不再在浏览器中创建 cookie(如果它是好事或坏事,我知道)
关于这个主题的大多数 Whosebug 查询都告诉我做我已经做过的事情,所以没有帮助
这是我的快速和会话设置:
const app = express()
const apiPort = process.env.PORT || process.env.API_PORT
app.use(cors({credentials: true, origin: process.env.ORIGIN_URL}))
mongoose.connection.on('error', (err) => {
console.error(err);
console.log('MongoDB connection error. Please make sure MongoDB is running.');
process.exit();
});
const sessionMiddleware = session({
resave: false,
saveUninitialized: false,
secret: process.env.SECRET,
// secure: true,
cookie: {
sameSite: true,
httpOnly: true,
secure: true,
maxAge: 1000 * 60 * 60 * 24 * 30
},
store: MongoStore.create({
mongoUrl: process.env.MONGODB_URI
})
})
app.use(sessionMiddleware);
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static("public"));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json())
app.post('/auth/login', (req, res, next) => {
passport.authenticate('local', (err, user, info) => {
if (err) { return next(err); }
if (info) {
return res.status(401).json({error: info.msg})
}
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.status(200).send(user);
});
})(req, res, next);
});
app.get('/auth/logout', (req, res) => {
req.logout()
res.sendStatus(200)
});
app.get('/checkToken', authCheck, (req, res) => {
res.status(200).send({accountType: res.accountType});
})
可能对解决此问题有用的其他信息:前端在单独的域上,上述服务器在 Heroku 上,数据库在 MongoDB 云中。
原来我所缺少的只是我的设置中的 app.set('trust proxy', 1)
和会话中间件中的 cookie: {}
中的 sameSite: 'none'
。
我将 node express 服务器投入生产。在开发中,express-session 运行良好(它使用 MemoryStore 将会话存储到 cookie 中)。但现在每次我刷新或发出请求时,它都会在 MongoStore 中创建一个新的会话 ID。此外,它不再在浏览器中创建 cookie(如果它是好事或坏事,我知道)
关于这个主题的大多数 Whosebug 查询都告诉我做我已经做过的事情,所以没有帮助
这是我的快速和会话设置:
const app = express()
const apiPort = process.env.PORT || process.env.API_PORT
app.use(cors({credentials: true, origin: process.env.ORIGIN_URL}))
mongoose.connection.on('error', (err) => {
console.error(err);
console.log('MongoDB connection error. Please make sure MongoDB is running.');
process.exit();
});
const sessionMiddleware = session({
resave: false,
saveUninitialized: false,
secret: process.env.SECRET,
// secure: true,
cookie: {
sameSite: true,
httpOnly: true,
secure: true,
maxAge: 1000 * 60 * 60 * 24 * 30
},
store: MongoStore.create({
mongoUrl: process.env.MONGODB_URI
})
})
app.use(sessionMiddleware);
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static("public"));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json())
app.post('/auth/login', (req, res, next) => {
passport.authenticate('local', (err, user, info) => {
if (err) { return next(err); }
if (info) {
return res.status(401).json({error: info.msg})
}
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.status(200).send(user);
});
})(req, res, next);
});
app.get('/auth/logout', (req, res) => {
req.logout()
res.sendStatus(200)
});
app.get('/checkToken', authCheck, (req, res) => {
res.status(200).send({accountType: res.accountType});
})
可能对解决此问题有用的其他信息:前端在单独的域上,上述服务器在 Heroku 上,数据库在 MongoDB 云中。
原来我所缺少的只是我的设置中的 app.set('trust proxy', 1)
和会话中间件中的 cookie: {}
中的 sameSite: 'none'
。