Sails.js用户注册的flash消息

我从http://irlnathan.github.io/sailscasts/blog/2013/08/27/building-a-sails-application-ep4-handling-validation-errors-with-a-flash了解Sail.js教程, 信息/

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

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

 module.exports.routes = { '/': { view: 'index' }, '/register': { view: 'register' } }; 

现在问题是使用闪光来显示用户在注册时的validation错误。 我在用户控制器(创build)中使用了以下内容,似乎不工作

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

有什么build议么?

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

编辑:请参阅Sails文档在这里获取更多的信息 – 基本上,因为您使用的是静态路由,所以在渲染视图之前不应用策略,因此Flash策略无法正常工作。 我build议在你的UserController添加一个register动作,并从那里调用res.view() 。 还有一个StackOverflow文章讨论这个,如果你想要更多的信息。

我有一个替代scheme,我为自己的项目开发,你可以尝试(也需要非静态路由)。

在您的api/policies文件夹中,创build一个策略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(); }; 

此政策允许三种不同的闪光types:成功,警告和错误。 它将为每个会话创build一个空字典,并在页面加载时清除它。

我在api/services创build了一个服务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.jsconfiguration文件中,确保将flash策略分配给您要使用flash的控制器操作:

 // 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相关的任何类。

在一个正常的mvc像rails或cakephp处理Flash是这样的:$ this-> Flash-> error('An Error Occurred Message'); 然后将其显示在一个元素中。

在帆中它应该是那么简单。

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

在部分视图中:flash.ejs

 <% if (req.session.flash) { %> <% if (req.session.flash.success) { %> <div data-alert class="alert-box success radius"> <%= req.flash('success') %> <a href="#" class="close">&times;</a> </div> <% } %> <% if (req.session.flash.warning) { %> <div data-alert class="alert-box warning radius"> <%= req.flash('warning') %> <a href="#" class="close">&times;</a> </div> <% } %> <% if (req.session.flash.error) { %> <div data-alert class="alert-box alert round"> <%= req.flash('error') %> <a href="#" class="close">&times;</a> </div> <% } %> <% } %> 

在布局上:

 <%- partial('partials/flash') %> 

处理每个字段的错误消息应该是Validation和Html Helper的一部分。 (例如: https : //gist.github.com/mikermcneil/8366092 )

您可以添加此导出:

 module.exports = function flash(req, res, next) { 

if(!req.session.flash){req.session.flash = {}; req.session.flash ['success'] = []; req.session.flash ['warning'] = []; }

下一个(); };

然后在视图中:

 <% if (req.session.flash['success'].length > 0) { %> 

0){%>

你可以像这样在控制器中创build消息:

 req.session.flash['success'].push('Updated successfully');