Flash-сообщение не отображается после выхода из системы

Маршрут выхода из системы

router.get('/logout', (req, res) => {
  delete req.session.returnTo;
  req.flash('success', 'Successfully Logged Out!');
  req.session.destroy();
  res.redirect('/home');
})

Маршрут для рендеринга домашнего вида

app.get('/home',(req,res) =>{
    const isLoggedIn = req.session.user ? true : false;
    res.render('home', { isLoggedIn });
})

Домашний вид

<% } if (!isLoggedIn)  { %>
        <% if (success.length > 0 ) {%>
          <div class = "alert alert-success alert-dismissible fade show" role = "alert">
            <%= success %>
            <alert type = "button" class = "btn-close" data-bs-dismiss = "alert" aria-label = "Close"></alert>
        </div>
        <% } %>
   <% } %>

Объяснение основного вопроса

Мои вспышки работают нормально для всех остальных маршрутов и просмотра, например, входа в систему и регистрации. Единственная проблема, с которой я сталкиваюсь, заключается в том, что на моем маршруте выхода из системы после удаления сеанса флэш-сообщение не появляется.

когда я удалил код req.session.destroy(); Flash-сообщение сработало нормально, поэтому поискал в Интернете решение, но не нашел ничего полезного. ваша помощь будет очень оценена.

У меня еще нет возможности протестировать ваш код, но у меня в голове возникает один вопрос: можем ли мы поместить в код более 1 запроса (req)? Я имею в виду, работаете ли вы сейчас с кодом, в котором есть два (или более) запроса?

FanoFN 15.06.2024 02:51

Как вы настроили express-session и connect-flash? Поделитесь кодом этих двух конфигураций.

Subha 15.06.2024 07:40

@FanoFN да, я использую два запроса одновременно в своем коде

Fatima sami 15.06.2024 11:14

@Subha, я настроил их в своем файле main.js, и все запросы сеанса работают в других моих маршрутах, таких как post ang get

Fatima sami 15.06.2024 11:15

В «документации» Connect-Flash указаны The flash is a special area of the session used for storing messages. и Flash messages are stored in the session., поэтому вполне логично, что после уничтожения сеанса он больше не работает.

GreenSaiko 17.06.2024 08:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как мы знаем, уничтожение сеанса повлияет на его зависимые ссылки, поэтому флэш-сообщения, если таковые имеются, хранятся в объекте сеанса. тоже будет потерян. Ниже приведены два обходных пути:

Используйте глобальное свойство, как показано ниже.

app.get('/logout', (req, res) => {
  delete req.session.returnTo;
  req.session.destroy();
  global.location = 'logout';
  res.redirect('/home');
});

app.get('/home', (req, res) => {
  const isLoggedIn = req.session.user ? true : false;
  if (global.location == 'logout') {
    req.flash('message', 'Successfully Logged Out!');
    delete global.location;
  }
  res.render('home', { isLoggedIn });
});

Используйте перенаправление со строкой запроса, как показано ниже.

   app.get('/logout', (req, res) => {
      delete req.session.returnTo;
      req.session.destroy();
      res.redirect(
        require('url').format({
          pathname: '/home',
          query: {
            location: 'logout',
          },
        })
      );
    });
    
    app.get('/home', (req, res) => {
      const isLoggedIn = req.session.user ? true : false;
      if (req.query.location == 'logout') {
        req.flash('message', 'Successfully Logged Out!');
      }
      res.render('home', { isLoggedIn });
    });

Цитаты:

Как мне перенаправить в expressjs при передаче некоторого контекста?

как отправить экспресс-сообщение о выходе из системы или проверить, перенаправлено ли

Другие вопросы по теме