nik*_*mac 14 node.js express connect-flash
快速连接闪存仅在刷新后显示. 代码被剥离以便于阅读.
"express": "~4.2.0",
"connect-flash": "~0.1.1",
Run Code Online (Sandbox Code Playgroud)
这是我的 app.js
var express = require('express'),
favicon = require('serve-favicon'),
flash = require('connect-flash');
var app = express();
app.use(cookieParser('---'));
app.use(session({
secret: '---',
saveUninitialized: true,
resave: true}));
app.use(flash());
app.use(function(req, res, next) {
res.locals.messages = req.flash();
next();
});
Run Code Online (Sandbox Code Playgroud)
在我的路线我试过像
req.flash('success', {msg: 'Sign Up Success'});
res.redirect('/me/dashboard');
Run Code Online (Sandbox Code Playgroud)
我的错误显示msg.jade模板是
for msg in messages
div #{msg.msg}
Run Code Online (Sandbox Code Playgroud)
我只是在刷新/ redirtect之后收到消息.请让我知道我做错了什么.
我也看到了这一点,但我觉得它过时了
raj*_*ade 18
您在中间件中调用flash方法,这是中间件的预期行为.中间件将在下一个请求中读取消息,并根据您的逻辑设置局部变量.
中间件如何工作?
当请求进入时,它会被传递给第一个中间件函数,以及一个包装的ServerResponse对象和下一个回调.中间件可以决定通过调用响应对象上的方法来响应,和/或通过调用方法next()将请求传递给堆栈中的下一层.
连接闪存
闪存是用于存储消息的会话的特殊区域.消息被写入闪存并在显示给用户后被清除.闪存通常与重定向结合使用,确保消息可用于要呈现的下一页.
我只在刷新/重定向后收到消息?
app.use(function(req, res, next) {
res.locals.messages = req.flash();
next();
});
Run Code Online (Sandbox Code Playgroud)
以上中间件将调用每个请求并设置req.flash()值.因此,您将获得req.flash('success', {msg: 'Sign Up Success'});每个下一个(后续)请求的值.不在当前页面上,而不重定向/刷新页面.
要覆盖此行为以获取没有刷新的值,您可以调用req.flash()可用于路由器中的闪存消息的函数res.locals.messages = req.flash();.
例如: - 在路由器中设置新的Flash消息后,在没有页面刷新的页面上显示失败的登录消息,并在成功重定向页面上显示.
router.post("/login", function (req, res) {
var username = req.body.username;
var pwd = req.body.pwd;
if (username === "demo" && pwd === "demo") {
req.flash("messages", { "success" : "Sign Up Success" });
res.redirect("/me/dashboard");
} else {
req.flash("messages", { "error" : "Invalid username or password" });
res.locals.messages = req.flash();
res.render("login', { title: 'Login"});
}
});
Run Code Online (Sandbox Code Playgroud)
结论:在同一页面上获取消息.通过在路由器本身中分配值来取消中间件的行为.