Express.js 应用程序错误:Flash 消息未呈现

Posted

技术标签:

【中文标题】Express.js 应用程序错误:Flash 消息未呈现【英文标题】:Express.js application bug: flash messages are not rendered 【发布时间】:2020-06-16 19:36:15 【问题描述】:

我正在使用Express、EJS 和 MongoDB 开发 blogging application(单击链接查看 GitHub 存储库)。

我在每次 CRUD 操作后尝试添加 flash 消息时遇到了麻烦。

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

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

【问题讨论】:

【参考方案1】:

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

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

像这样。

【讨论】:

编辑了答案。对不起,我在手机上,它变得很有挑战性? 不使用es6语法试试 请帮我处理一下 this question。谢谢!

以上是关于Express.js 应用程序错误:Flash 消息未呈现的主要内容,如果未能解决你的问题,请参考以下文章

计时器运行时,Express.js上的504 Gateway Timeout错误

错误:配置错误的 csrf - Express JS 4

错误:ENOENT:Angular2 和 Express.js 没有这样的文件或目录

来自express js的Ajax发布响应不断抛出错误

Express Js EJS 布局错误:未指定默认引擎且未提供扩展名

Express.js 对 Angular CORS 错误的响应