Express.js 应用程序错误:不呈现 flash 消息

Express.js application bug: flash messages are not rendered

我正在研究 blogging application (click the link to see the GitHub repo) with Express, EJS 和 MongoDB。

我 运行 在每次 CRUD 操作后尝试添加即显消息时遇到麻烦。

对于添加 Post(操作本身 有效),我有:

exports.addPost = (req, res, next) => {
    const post = new Post();
        post.title = req.body.title;
        post.short_description = req.body.excerpt
        post.full_text = req.body.body;

    post.save(function(err){
        if(err){
            console.log(err);
            return;
        } else {
            // Confirmation message
            req.flash('success', "Post added");
            res.redirect('/dashboard');
        }
    });
}

在我的 index.js 文件中,我添加了所有必要的包和中间件:

const expressValidator = require("express-validator");
const flash = require("connect-flash");
const session = require("express-session");

// more code

// Express Sessions Middleware
app.use(session({
  secret: 'keyboard cat',
  resave: true,
  saveUninitialized: true
}));

// Express Messages Middleware
app.use(flash());
app.use(function (req, res, next) {
  res.locals.messages = require('express-messages')(req, res);
  next();
});

// Express Validator Middleware
app.use(expressValidator({
  errorFormatter: function(param, msg, value) {
      var namespace = param.split('.')
      , root    = namespace.shift()
      , formParam = root;

    while(namespace.length) {
      formParam += '[' + namespace.shift() + ']';
    }
    return {
      param : formParam,
      msg   : msg,
      value : value
    };
  }
}));

消息模板(采用 https://github.com/visionmedia/express-messages 格式并稍作修改):

<div id="messages">
  <% Object.keys(messages).forEach(function (type) { %>
        <% messages[type].forEach(function (message) { %>
            <div class="alert alert-<%= type %>"><%= message %></div>
        <% }) %>
  <% }) %>
</div>

我以为我做的一切都正确,但消息容器呈现为空:

<div id="messages">
 // messages should be here
</div>

缺少什么?

注:我用的express-validator版本是3.2.1.

Flash 消息是异步的,因此您需要包装、重定向:

req.flash('success', "Post added");
req.session.save(() => res.redirect('/dashboard'));

像这样。