Express-session: req.session.variable переназначение не действует между двумя маршрутами - PullRequest
0 голосов
/ 09 ноября 2019

Я создаю очень простое приложение, в котором вошедший в систему пользователь может искать и бронировать поездки на поездах через Express, MongDB, Mongoose и Express-session. Выбранные поездки временно сохраняются в переменной req.session.order (которая, как я понимаю, является глобальной для всех маршрутов) и после подтверждения сохраняются в БД в качестве поддокументов пользователя, а B-req.session.order назначаетсяпустой массив, чтобы пользователь мог продолжить бронирование / выбор других поездок. Проблема заключается в том, что после подтверждения при возвращении на домашнюю страницу массив req.session.order не пуст и все еще содержит ранее выбранные поездки, которые уже были подтверждены и сохранены.

Как вы можете видеть вПриведенный ниже код, я просто консоль регистрирую req.session.order в конце инструкции маршрута / verify, которая возвращает пустой массив, как и ожидалось, но при возвращении на домашнюю страницу консоль по-прежнему записывает в журнал ранее выдвинутый trip._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', async function(req, res, 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, res, 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 });
  }
});

1 Ответ

0 голосов
/ 11 ноября 2019

Сессионные объекты необходимо сохранить после того, как вы измените их с помощью req.session.save(). При использовании хранилища памяти по умолчанию для сессий вы избегаете некоторых типов модификации сессий (при изменении, а не при замене встроенного объекта, такого как ваш массив), но при переходе в реальное готовое к хранению хранилище даже такие типы изменений вероятныне будет работать должным образом.

Итак, после изменения сеанса вызовите req.session.save().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...