В Express.js как сделать так, чтобы мой шаблон отображал флеш-сообщения? - PullRequest
4 голосов
/ 01 июля 2011
app.get('/',function(req,res){
    res.render('home'); // I want the template to be able to access the flash message..
});

app.get('/go',function(req,res){
    req.flash("info", "You went GO, and got redirected to home!");
    res.redirect('/');
});

Пользователь сначала заходит в "/ go". После этого он будет перенаправлен на «/», и я хочу, чтобы флеш-сообщение отображалось как предупреждение JavaScript.

Как я могу это сделать?

Ответы [ 6 ]

10 голосов
/ 01 июля 2011

Добавьте его как локальный к вашему вызову для рендеринга:

res.render("home", {info: req.flash("info")});

И используйте его в своем шаблоне:

#flash
  p= info
6 голосов
/ 14 апреля 2012

Вы можете использовать экспресс-помощников, чтобы сделать вашу жизнь проще.

app.dynamicHelpers({flashMessages: function(req, res) {
var html = ""
  , flash  = req.flash();
['error', 'info'].forEach(function(type) {
  if(flash[type]) {
    flash[type].forEach(function(message) {
      html += "<div class='alert " + type + "'>" + message + "</div>";
    });
  }
});
return html; }});

и в вашем макете (пример ejs)

  <body><%- flashMessages %><%- body %></body>
4 голосов
/ 30 октября 2012
app.dynamicHelpers({flash: function(req, res){return req.flash();}});

Теперь у вас есть доступ к флэш-объекту в вашем представлении.Нет HTML в вашей логике и нет необходимости добавлять все параметры в каждом маршруте.

2 голосов
/ 02 мая 2014

Я использую следующий код для отображения флэш-сообщения:

В app.js

app.use(function (req, res, next) {
 req.session.message = req.session.message || { error: [], success: [], info: [] };
 app.locals.message  = req.session.message;
}

В вашем user.js маршруте:

app.post('/users/new', function (req, res, next) {
    //...
    // do some work
    req.session.message.info.push('Account created successfully');
    res.redirect('/login');
});

Затем создайте message.jade представление, которое можно включить в другие представления:

В message.jade

- var i
- if (message.error && message.error.length)
  .alert.alert-warning.alert-dismissable
    button.close(type="button", data-dismiss="alert", aria-hidden="true") &times;
    - for (i = 0; i < message.error.length; i++)
      .center!= message.error[i]
- if (message.info && message.info.length)
  .alert.alert-info.alert-dismissable
    button.close(type="button", data-dismiss="alert", aria-hidden="true") &times;
    - for (i = 0; i < message.info.length; i++)
      .center!= message.info[i]
- message.info = message.error = [] // REMEMBER to reset messages to an empty array
1 голос
/ 22 мая 2012

Если бы возникла похожая проблема, решение выглядит следующим образом:

req.flash('error', 'validation failed');
res.redirect('back');

Использование back, похоже, поддерживает флэш-сообщение, в то время как при перенаправлении на тот же маршрут оно теряется.

0 голосов
/ 03 декабря 2012

Если вы используете Express 3, встроенная функция флэш-памяти была удалена. Чтобы получить такую ​​же функциональность, вам нужно установить модуль connect-flash, а затем добавить код из этого списка сразу после инициализации сеансов и до app.use(app.router);: https://gist.github.com/3070950

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