Node.js 用于用户注册的Sails.js闪存消息

Node.js 用于用户注册的Sails.js闪存消息,node.js,express,sails.js,Node.js,Express,Sails.js,我正在学习来自的Sail.js教程 然而,我遇到了一个小问题。在本教程中,作者使用其用户文件夹中的注册文件,并在用户控制器中指定路线。然后,他使用flash向用户发送验证错误 但是在我的项目中,注册文件位于根文件夹中,我从routes.js文件中分配路由,如下所示 module.exports.routes = { '/': { view: 'index' }, '/register': { view: 'register' } }; 现在的问题是在注册时

我正在学习来自的Sail.js教程

然而,我遇到了一个小问题。在本教程中,作者使用其用户文件夹中的注册文件,并在用户控制器中指定路线。然后,他使用
flash
向用户发送验证错误

但是在我的项目中,注册文件位于根文件夹中,我从routes.js文件中分配路由,如下所示

module.exports.routes = {

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

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

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

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编辑:有关更多信息,请参阅Sails文档-基本上,由于您使用的是静态路由,在渲染视图之前没有应用任何策略,因此flash策略不起作用。我建议在
UserController
中添加
register
操作,然后从那里调用
res.view()
。如果你想了解更多信息,还有一个讨论这个问题的网站

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

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
config文件中,确保将
flash
策略分配给要使用flash的控制器操作:

// config/policies.js
module.exports.policies = {
  '*': [true, 'flash'],
  'UserController': {
    'register': ['flash'],
    // any future actions that want flash
  },
  'AnotherController': {
    'someAction': ['flash', 'somePolicy'],
  }
}
要在您的
注册
操作中闪烁消息,只需使用
FlashService.success(req,message)
。或者,您也可以使用
FlashService.error
FlashService.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>
<% } %> 
0){%>


0) { %>

0) { %>

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

您可以添加此导出:

然后在视图中:


在rails或cakephp这样的普通mvc中,处理flash是这样的:$this->flash->error(“出错消息”),然后在元素中显示它

在帆船上,应该是这么简单

在控制器中:req.flash('错误','发生错误消息')

部分视图:flash.ejs


关于布局:



处理每个字段的错误消息应该是验证和Html帮助程序的一部分。(例如:)

您的解决方案看起来不错,而且组织性很强。我按照您的建议做了,但是我在视图中没有收到任何
消息的值。
消息总是未定义:/Ahh,因为静态路由,策略不适用。我要做的是将
注册
视图映射到
用户控件的操作ler
。这也可能是您正在学习的教程中flash策略不起作用的原因。有关详细信息,请参阅Sails文档。编辑了上面的我的回答!感谢您的解释!:)如果您可以看一看,我添加了另一个与此相关的问题。谢谢。我不明白您为什么要使用
。.clone()
没有问题。有什么建议吗?请参阅。本质上,您希望创建一份消息副本,以便用户下一步操作时清除这些消息。这些flash消息并不意味着在每次页面加载时都会持续。请在此处说明问题的完整解决方案。我添加了此处使用的最有可能的sails.js版本,以使您的案例重新得到验证您的案例似乎是由此处观察到的特定版本特征引起的
module.exports = function flash(req, res, next) {
  if (!req.session.flash) {
    req.session.flash = {};
    req.session.flash['success'] = [];
    req.session.flash['warning'] = [];
  }
  next();
};
<% if (req.session.flash['success'].length > 0) { %>
<div class="alert alert-success">
  <%= req.session.flash['success'].pop() %>
</div>
<% } %>
<% if (req.session.flash['warning'].length > 0) { %>
<div class="alert alert-warning">
  <%= req.session.flash['warning'].pop() %>
</div>
<% } %>
req.session.flash['success'].push('Updated successfully');