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

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

正如您在下面的代码中看到的那样,我只是控制台在/ confirm route指令的末尾记录req.session.order,该指令按预期返回空数组,但是回到主页时,控制台仍会记录先前已完成的旅程。_id。

感觉我在快速会话中缺少一些东西,非常感谢您的帮助

// (req.session.order are initialized to [] in singnin/signup routes before redirecting to home page)

/* GET confirmation page. */
router.get('/order',async function(req,res,next) {
  var bookedJourney = await journeyModel.findOne({ _id: req.query.id });
  **req.session.order.push(bookedJourney);**
  res.render('confirmation',{order: req.session.order,reformatTime: reformatTime,reformatDate: reformatDate});
});

/* POST add selected journeys to trip list */
router.post('/confirm',next) {
  var currentUser = await userModel.findOne({ email: req.session.user.email });
  req.session.order.forEach((order) => {
    currentUser.journey.push(order._id);
  });
  await currentUser.save();
  **req.session.order = []; // This returns empty array as expected**
  console.log(req.session.order);
});

In the HTML,when clicking on the confirm button,a modal is launched with a button leading back to home page:

/* GET home page. */
router.get('/home',function(req,next) {
  **console.log(req.session.order); // Not sure why the req.session.order here still contains the bookedJourney id,should be []**
  if (!req.session.user) {
    res.redirect("/");
  } else {
    console.log(req.session.order); // ditto
    res.render('home',{ user: req.session.user });
  }
});
michaelwong2009 回答:快速会话:req.session.variable重新分配在两条路由之间无效

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

因此,在修改会话后,请致电req.session.save()

本文链接:https://www.f2er.com/3131994.html

大家都在问