作为express应用程序中通用get路由的一部分,我想发送两条带有express-session和connect-flash的Flash消息。除了在页面呈现前不保存req.flash之外,所有其他方法均有效。因此,直到用户再次加载另一页或同一页面时,才会显示Flash消息。
路线中最后一个功能的代码:
Post.countDocuments().exec(function(err, count){
if(err) {
console.log(err);
res.redirect("back");
}
req.flash("success", ["It's working", "Hallelujah!"]);
req.flash("error", ["Uh oh!", "We have a problem..."]);
res.render("index", {posts: allPosts, dates: dates, current: pageNumber, pages: Math.ceil(count / pageLimit), showing: showing, total: count});
});
这是Flash消息模板(ejs)之一的代码:
<div class="flash flash-success">
<div class="flash-header">
<span class="flash-title flash-title-success"><i class="fas fa-check"></i> <%= success[0] %></span>
<span class="flash-close" onclick="return closeFlash(this);"><i class="fas fa-times"></i></span>
</div>
<hr class="flash-hr">
<div class="flash-body-success"><%= success[1] %></div>
</div>
我尝试在req.flash之后使用.exec()来使render语句在完成时运行,但是这没有用,我还尝试了req.session.save()与回调中的render语句,但是这也失败了。
无法通过摆脱其中一个req.flash语句或仅传递一个字符串参数而不是两个数组来解决此问题。
答案 0 :(得分:0)
问题是我有
app.use(function(req, res, next) {
res.locals.currentUser = req.user;
res.locals.error = req.flash("error);
res.locals.success = req.flash("success");
return next();
});
在app.js中,因此该中间件在路由有机会为req.flash设置值之前运行,这意味着错误和成功设置为空。
我通过在呈现页面之前创建一个将req.flash保存在res.locals中的功能来解决此问题:
var toolsObj = {};
toolsObj.saveFlash = function(req, res) {
res.locals.error = req.flash("error");
res.locals.success = req.flash("success");
};
module.exports = toolsObj;