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.js
configuration文件中,确保将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.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> <% } %>
当然,你将不得不将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">×</a> </div> <% } %> <% if (req.session.flash.warning) { %> <div data-alert class="alert-box warning radius"> <%= req.flash('warning') %> <a href="#" class="close">×</a> </div> <% } %> <% if (req.session.flash.error) { %> <div data-alert class="alert-box alert round"> <%= req.flash('error') %> <a href="#" class="close">×</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');