#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.