2016-08-10 6 views
1

Этот вопрос задан уже миллион раз, но я никогда не понимал ответы, и когда я это сделал, они не соответствовали моим конкретным потребностям.Как создать флеш-сообщения в Express/NodeJS?

я в настоящее время флэш-сообщения реализованы с помощью этого:

app.use(function(req, res, next){  
    res.locals.sessionFlash = req.session.sessionFlash; 
    delete req.session.sessionFlash; 
    next(); 
}); 

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

res.render('...', { 
    sessionFlash: res.locals.sessionFlash 
}); 

Есть более простой способ сделать это (желательно, где мне не нужно будет выводить сообщения из сеанса вручную)?

ответ

1

Такое поведение используется в крупных структур, таких как sails.js

вы можете увидеть код здесь: https://github.com/balderdashy/sails/blob/0506f0681590dc92986985bc39609c88b718a997/lib/router/res.js

вы можете достичь его по-разному, но это самое простое.

1: наиважнейшая

вы можете переопределить функцию через "middlewares"

app.use(function(req, res, next) { 
    // grab reference of render 
    var _render = res.render; 
    // override logic 
    res.render = function(view, options, fn) { 
     // do some custom logic 
     _.extend(options, {session: true}); 
     // continue with original render 
     _render.call(this, view, options, fn); 
    } 
    next(); 
}); 

Я взял этот отрывок из: https://stackoverflow.com/a/24051339/5384679 вы можете копировать без lodash и т.д.

2: обертывание делают в новая функция

Сделайте свою собственную функцию, чтобы обернуть сеанс flashMessage, вы может использовать this в ваших интересах, я использовал некоторый синтаксис es6 из лени, но его легко заменить на код es5.

res.sendView = function(path, options) { 
    this.render(path, { 
    sessionFlash: res.locals.sessionFlash, 
    ...options 
    }); 
} 
// now you can use res.sendView instead of res.render. 
+0

«Превосходный» метод работал как очарование для меня, спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^