刷新或二次发布后才会显示Flash消息?

时间:2015-01-05 03:32:16

标签: javascript node.js express sails.js

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

一般机制很有效,但是,只有在二次刷新之后或另一篇帖子之后才能看到flash消息。它首先在页面加载时不显示。以下是我如何构建所有内容并且我目前正在使用"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>
<% } %>

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

谢谢,

1 个答案:

答案 0 :(得分:0)

在执行控制器之前正在读取您的消息(并且只有在读取消息后才设置消息)。您的视图中提供了req对象,您应该直接在视图中阅读req.session.messages [&#39; xxxx&#39;]。