这个问题已经被问了一百万次,但我从来没有真正理解答案,当我这样做时,它们并不适合我的具体需求。
我目前使用以下方法实现了Flash消息:
app.use(function(req, res, next){
res.locals.sessionFlash = req.session.sessionFlash;
delete req.session.sessionFlash;
next();
});
当我想在路线中使用该消息时,我必须明确地回忆起它:
res.render('...', {
sessionFlash: res.locals.sessionFlash
});
有没有更简单的方法(最好是我不需要手动从会话中提取消息)?
答案 0 :(得分:1)
此行为由大型框架(例如sails.js
您可以在此处查看代码:https://github.com/balderdashy/sails/blob/0506f0681590dc92986985bc39609c88b718a997/lib/router/res.js
你可以通过各种方式实现它,但这些是最简单的。
您可以通过"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等的情况下复制。
创建自己的函数来包装会话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.