如何使用express和connect-flash显示没有页面刷新的flash消息?

时间:2014-08-25 07:07:28

标签: node.js express connect-flash

快速连接 - 闪存仅在刷新后显示。 代码被删除以便于阅读。

"express": "~4.2.0",
"connect-flash": "~0.1.1",

这是我的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();
});

在我的路线中,我尝试了类似

的内容
req.flash('success', {msg: 'Sign Up Success'});
res.redirect('/me/dashboard');

我的错误显示msg.jade模板是

for msg in messages
      div #{msg.msg}

我只是在刷新/ redirtect之后收到消息。请让我知道我做错了什么。

我也见过this,但我觉得它过时了

1 个答案:

答案 0 :(得分:17)

您正在调用中间件中的flash方法,这是中间件的预期行为。中间件将在下一个请求中读取消息&根据你的逻辑设置局部变量。

中间件的工作原理?

当请求进入时,它会被传递给第一个中间件函数,以及一个包装的ServerResponse对象和下一个回调。中间件可以决定通过调用响应对象上的方法来响应,和/或通过调用方法next()将请求传递给堆栈中的下一层。

连接闪光

flash是会话的一个特殊区域,用于存储消息。消息被写入闪存并在显示给用户后被清除。闪存通常与重定向结合使用,确保消息可用于要呈现的下一页。

我只在刷新/重定向后收到消息?

app.use(function(req, res, next) {
    res.locals.messages = req.flash();
    next();
});

以上中间件将呼叫每个请求&设置req.flash()值。因此,您将在每个下一个(后续)请求中获得req.flash('success', {msg: 'Sign Up Success'});值。不在当前页面上,而无需重定向/刷新页面。

要覆盖此行为以获取没有刷新的值,您可以使用req.flash()调用可用于路由器中的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"});
    }
});

结论:要在同一页面上获取消息。通过在路由器本身中分配值来取消中间件的行为。