如何在Express / NodeJS中创建Flash消息?

时间:2016-08-10 22:34:44

标签: node.js express flash-message

这个问题已经被问了一百万次,但我从来没有真正理解答案,当我这样做时,它们并不适合我的具体需求。

我目前使用以下方法实现了Flash消息:

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

当我想在路线中使用该消息时,我必须明确地回忆起它:

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

有没有更简单的方法(最好是我不需要手动从会话中提取消息)?

1 个答案:

答案 0 :(得分: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.