在刷新或二次发布之前不会显示 Flash 消息?

Flash message doesn't show until refresh or secondary post?

我再次进入 Sails.js 并努力在我的应用程序中创建即时消息(用于错误、成功或警报)。我一直在寻找一种好的方法,found this discussion,我实施了他们建议的解决方案。

通用机制运行良好,但是,只有在二次刷新或另一次 post 之后才会看到闪现消息。它最初不会在页面加载时显示。这是我组织所有内容的方式,我目前正在使用 "sails": "~0.10.0-rc7"

在我的 api/policies 文件夹中,我有 flash.js:

// flash.js policy
module.exports = function(req, res, next) {
  res.locals.messages = {
    success: [], 
    error: [], 
    warning: []
  };

  if(!req.session.messages) {
    req.session.messages = { success: [], error: [], warning: [] };
    return next();
  }

  res.locals.messages = _.clone(req.session.messages);

  // Clear flash
  req.session.messages = { success: [], error: [], warning: [] };
  return next();
};

在我的 api/services 中,我有 FlashService.js:

// FlashService.js
module.exports = {

  success: function(req, message) {
    req.session.messages['success'].push(message);
  },

  warning: function(req, message) { 
    req.session.messages['warning'].push(message);
  },  

  error: function(req, message) {
    req.session.messages['error'].push(message);
  }
}

我的 config/policies.js 也配置了 flash 策略:

// config/policies.js
module.exports.policies = {
  '*': [true, 'flash'],
  'UserController': {
    'join': ['flash'],
  },
};

现在,通过所有这些设置,我如何使用它的示例在我的 UserController 中用于我的 join 操作:

module.exports = {

    join: function(req, res) {

        // If username, email, and password compare come back true: create user.
        if(newUser.username && newUser.email && newUser.password == newUser.confirmPassword) {

            // Logic to create user.
            res.view();

        // If not, then report an issue.
        } else {

            FlashService.error(req, 'There was an issue.');
            res.view();

         };
    }
};

最后,我的观点与我链接的讨论的代码完全相同。我在这上面使用 EJS

<% if (messages && messages['error'].length > 0) { %>
  <div class="alert alert-danger">
  <% messages['error'].forEach(function(message) { %>
    <%= message %>
    <br>
  <% }); %>
  </div>
  <br>
<% } %>
<% if (messages && messages['warning'].length > 0) { %>
  <div class="alert alert-warning">
  <% messages['warning'].forEach(function(message) { %>
    <%= message %>
    <br>
  <% }); %>
  </div>
  <br>
<% } %>
<% if (messages && messages['success'].length > 0) { %>
  <div class="alert alert-success">
  <% messages['success'].forEach(function(message) { %>
    <%= message %>
    <br>
  <% }); %>
  </div>
  <br>
<% } %>

我做错了什么?任何帮助将不胜感激!

谢谢,

在执行控制器之前正在读取您的消息(并且只是在读取消息后设置消息)。 req 对象在您的视图中可用,您应该直接将 req.session.messages['xxxx'] 读入您的视图。