Избегайте req.flash удаления данных в промежуточном программном обеспечении

#node.js #middleware #connect-flash

#node.js #промежуточное программное обеспечение #подключение-flash

Вопрос:

Я использую connect-flash с помощью express для обработки флэш-сообщений, но эти сообщения удаляются, когда я читаю эти свойства, например:

Определение флэш-сообщения:

 req.flash("myMessage", "Hey!");
  

Чтение сообщения:

 console.log(req.flash("myMessage")); // Hey!
console.log(req.flash("myMessage")); // undefined
  

Данные удаляются при первом чтении, и это проблема, потому что мне нужно прочитать данные req.flash в промежуточном программном обеспечении для фильтрации http-запроса, а после в контроллере (который находится в другом файле) мне нужно прочитать те же данные req.flash, но я не могу, потому что вчтение промежуточного программного обеспечения было удалено.

Что я могу сделать в этом случае?

Ответ №1:

Сообщения хранятся req.session.flash внутри, см. Исходный код.

Это означает, что вы можете получить сообщение путем индексации непосредственно в req.session.flash["myMessage"] без его очистки.

Технически это деталь реализации req.flash() , на которую вам не следует полагаться, но я думаю, что если вы укажете версию connect-flash в своих требованиях, это будет достаточно безопасно.

Ответ №2:

Повторный вызов req.flash, очевидно, что первый вызов фактически удаляет флэш-данные. Вот почему, когда вы снова вызываете req.flash, данные теперь не определены или являются пустым массивом.

 1st console.log output: [ 'Hey!' ]
2nd console.log output: []
  

Имеет ли это смысл?

Ответ №3:

Сохраните сообщение в объекте запроса, например:

 req.myMessage = req.flash("myMessage");
  

И это будет доступно во всех промежуточных программах, которые вы хотите для этого конкретного запроса.

Кстати, убедитесь, что вы используете connect-flash, потому что вы перенаправляете пользователя на другой маршрут, и это запускает новый запрос, и вы хотите сохранять данные между запросами (и именно поэтому вы хотите использовать для этого сеанс). При этом рекомендуется удалять сообщение из сеанса, а не просто пытаться получить к нему доступ.

Если вы не перенаправляете пользователя, подумайте, нужна ли connect-flash.