我正在关注来自 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.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 相关的任何类。
关于node.js - 用于用户注册的 Sails.js 闪现消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25350841/