node.js - 用于用户注册的 Sails.js 闪现消息

标签 node.js express sails.js

我正在关注来自 http://irlnathan.github.io/sailscasts/blog/2013/08/27/building-a-sails-application-ep4-handling-validation-errors-with-a-flash-message/ 的 Sail.js 教程

但是我遇到了一个小问题。在本教程中,作者使用其用户文件夹中的注册文件并在用户 Controller 中分配路由。然后,他使用 flash 向用户发送验证错误。

但是在我的项目中,注册文件位于根文件夹中,我从 routes.js 文件中分配路由,就像这样

module.exports.routes = {

  '/': {
    view: 'index'
  },

  '/register': {
    view: 'register'
  }

};

现在的问题是在注册时使用 flash 向用户显示验证错误。我在用户 Controller (创建)中使用了以下内容,但它似乎不起作用

if (err){
    err.success = 0;
    console.log(err);
    req.session.flash = {
        err: err   
    }
    req.flash('error', req.session.flash);
    return res.redirect('/register');
}

有什么建议吗?

Sails.js 版本 < 0.10.x 基于他的其他线程输出 here

最佳答案

编辑:参见 Sails 文档 here了解更多信息 - 基本上,由于您使用的是静态路由,因此在呈现 View 之前没有应用任何策略,因此闪存策略不起作用。我建议在您的 UserController 中添加一个 register 操作,然后从那里调用 res.view()。还有一个 StackOverflow post讨论这个,如果你想了解更多信息。

我确实有一个我为自己的项目开发的替代方案,您可以试用(也需要非静态路由)。

在您的 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();
};

此策略允许三种不同的闪存类型:成功、警告和错误。它将为每个 session 创建一个空字典,并在页面加载时清除它。

我在 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 策略分配给您想要使用 flash 的 Controller 操作:

// config/policies.js
module.exports.policies = {
  '*': [true, 'flash'],
  'UserController': {
    'register': ['flash'],
    // any future actions that want flash
  },
  'AnotherController': {
    'someAction': ['flash', 'somePolicy'],
  }
}

要在您的register 操作中闪现一条消息,只需使用FlashService.success(req, message)。或者,您可以使用 FlashService.errorFlashService.warning,具体取决于您的 UI 样式的工作方式以及您希望在多大程度上区分您的 Flash 消息。

在你看来,你可以这样写:

<% 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>
<% } %> 

当然,您必须将 div 类更改为与您的 UI 相关的任何类。

关于node.js - 用于用户注册的 Sails.js 闪现消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25350841/

相关文章:

javascript - Selenium - 计算具有匹配类的元素数

node.js - sails.js - 我如何在模型 Hook beforeCreate 中访问 session 数据

oauth - 如何使用Mocha在sails js中对google oauth护照进行单元测试

node.js - 在本地安装 Node Grunt

javascript - 在 Express JS 中设置 HTTPS

javascript - Node .js。错误 : module is not a function

node.js - 注销后nodejs实际上并没有销毁 session

javascript - 错误: read ECONNRESET when connected to a mysql server with Node.js

node.js - html 到文件缓存的模块

jquery - 风 sails :How can i read excel file data into json format