Javascript 快速会话:req.session.variable重新分配在两条路由之间无效

Javascript 快速会话:req.session.variable重新分配在两条路由之间无效,javascript,mongodb,express,mongoose,Javascript,Mongodb,Express,Mongoose,我正在开发一个非常简单的应用程序,登录用户可以通过Express、MongDB、Mongoose和Express会话搜索和预订火车旅程。所选行程临时保存在req.session.order变量中(据我所知,该变量是所有路线的全局变量),一旦确认,A-存储在DB中作为用户的子文档,B-req.session.order分配给空数组,以便用户可以继续预订/选择其他行程。问题是在确认之后,返回主页时,req.session.order数组不是空的,仍然包含以前选择的已确认和存储的行程 正如您在下面的代

我正在开发一个非常简单的应用程序,登录用户可以通过Express、MongDB、Mongoose和Express会话搜索和预订火车旅程。所选行程临时保存在req.session.order变量中(据我所知,该变量是所有路线的全局变量),一旦确认,A-存储在DB中作为用户的子文档,B-req.session.order分配给空数组,以便用户可以继续预订/选择其他行程。问题是在确认之后,返回主页时,req.session.order数组不是空的,仍然包含以前选择的已确认和存储的行程

正如您在下面的代码中所看到的,我只是在控制台记录/confirm route指令末尾的req.session.order,该指令按预期返回空数组,但返回主页时,控制台仍会记录以前推送的旅程。\ u id

感觉我错过了一些与快速会议,非常感谢您的帮助

/(在重新定向到主页之前,singnin/signup路由中的req.session.order被初始化为[])
/*获取确认页面*/
get('/order',异步函数(req、res、next){
var bookedtoweed=await journeyModel.findOne({u id:req.query.id});
**请求会话、订单、推送(预订行程)**
res.render('confirmation',{order:req.session.order,reformatTime:reformatTime,reformatDate:reformatDate});
});
/*将所选行程添加到行程列表后*/
router.post('/confirm',异步函数(req、res、next){
var currentUser=await userModel.findOne({email:req.session.user.email});
请求会话顺序forEach((顺序)=>{
当前用户行程推送(订单号);
});
等待currentUser.save();
**req.session.order=[];//按预期返回空数组**
控制台日志(请求会话顺序);
});
在HTML中,单击“确认”按钮时,会启动一个模式,其中一个按钮返回主页:
/*获取主页*/
router.get('/home',函数(req、res、next){
**console.log(req.session.order);//不确定为什么这里的req.session.order仍然包含BookedTourney id,应该是[]**
如果(!req.session.user){
res.redirect(“/”);
}否则{
console.log(req.session.order);//同上
res.render('home',{user:req.session.user});
}
});

使用
req.Session.save()
修改会话对象后,需要保存它们。在会话使用默认内存存储时,您可以进行某些类型的会话修改(在修改时,不要替换数组之类的嵌入式对象),但当您移动到真正的生产就绪存储时,即使是这些类型的修改也可能无法正常工作


因此,在修改会话后,调用
req.session.save()

,这取决于您配置会话的方式,您可能需要在修改会话后进行修改,否则更改将不会持续到将来的请求中。谢谢,我将查看链接中的文档,感谢againIt已经工作,非常感谢,我仍然不明白为什么在推送之后不需要req.session.save(),而在重新分配到空数组之后不需要。我猜您仍然在使用基于内存的会话数据存储(默认选项)。如果是这样,那可能是因为如果修改存储中的对象,则会在内存数据存储中反映,但如果替换对象,则在执行
.save()
之前,该对象不会复制到实际存储中。如果您使用的是数据库后台存储,可能两个示例都会有问题。谢谢,这非常有用。我确实使用了默认的数据存储,您是对的,可能是因为我想通过重新分配对象来更改对象,我将尝试弹出()并查看它是否有效。tksYes,刚刚意识到当存在res.redirect/render等时,不需要req.session.save()。但是正如您所说,我添加了save(),以避免在生产模式中出现任何随机不便。非常感谢。