Mensaje flash de Sails.js para registro de usuario

Sigo el tutorial de Sail.js de http://irlnathan.github.io/sailscasts/blog/2013/08/27/building-a-sails-application-ep4-handling-validation-errors-with-a-flash- mensaje/

Sin embargo me encontré con un pequeño problema. En el tutorial, el autor utiliza archivos de registro dentro de su carpeta de usuario y asigna rutas en el controlador del usuario. A continuación, envía errores de validación utilizando flash para el usuario.

Sin embargo, en mi proyecto, los archivos de registro se encuentran en la carpeta raíz y asigno las rutas desde el archivo route.js como tal

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

Ahora el problema es usar flash para mostrar a los usuarios los errores de validación durante el registro. He utilizado lo siguiente en el controlador de usuario (crear) y parece que no funciona

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

¿Alguna sugerencia?

Versión de Sails.js <0.10.x basada en su salida de otro hilo aquí

EDITAR: consulte la documentación de Sails aquí para obtener más información. Básicamente, dado que está utilizando el enrutamiento estático, no se aplican políticas antes de mostrar la vista, por lo tanto, la política flash no funciona. Recomiendo agregar una acción de register en su UserController y simplemente llamar res.view() desde allí. También hay una publicación de StackOverflow que trata esto, si quieres más información.

Tengo una alternativa que desarrollé para mi propio proyecto que puedes probar (también requiere enrutamiento no estático).

En su carpeta de aplicaciones api/policies , cree una política 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(); }; 

Esta política permite tres tipos diferentes de flash: éxito, advertencia y error. Creará un diccionario vacío para cada sesión y lo borrará en las cargas de la página.

FlashService.js un servicio FlashService.js en api/services para flashear más fácilmente los mensajes:

 // 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); } } 

Luego, en su archivo de configuración config/policies.js policy.js, asegúrese de asignar la política de flash a las acciones del controlador que desea usar flash con:

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

Para flashear un mensaje en su acción de register , simplemente use FlashService.success(req, message) . Alternativamente, puede usar FlashService.error y FlashService.warning , dependiendo de cómo funciona su estilo de interfaz de usuario y cuánto quiere diferenciar sus mensajes flash.

En su opinión, puede poner algo como esto:

 <% if (messages && messages['error'].length > 0) { %> 
<% messages['error'].forEach(function(message) { %> <%= message %>
<% }); %>

<% } %> <% if (messages && messages['warning'].length > 0) { %>
<% messages['warning'].forEach(function(message) { %> <%= message %>
<% }); %>

<% } %> <% if (messages && messages['success'].length > 0) { %>
<% messages['success'].forEach(function(message) { %> <%= message %>
<% }); %>

<% } %>

Por supuesto, tendrás que cambiar las clases div a las clases que sean relevantes para tu interfaz de usuario.

En un mvc normal, como Rails o cakephp, el manejo de flash es algo como esto: $ this-> Flash-> error (‘Un mensaje de error ocurrió’); luego lo muestra en un elemento.

En las velas debería ser tan simple como eso.

En el controlador: req.flash (‘error’, ‘Mensaje de error ocurrido’);

En vista parcial: flash.ejs

 <% if (req.session.flash) { %> <% if (req.session.flash.success) { %> 
<%= req.flash('success') %> ×
<% } %> <% if (req.session.flash.warning) { %>
<%= req.flash('warning') %> ×
<% } %> <% if (req.session.flash.error) { %>
<%= req.flash('error') %> ×
<% } %> <% } %>

En diseño:

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

El manejo del mensaje de error por campo debe formar parte de una validación y un ayudante HTML. (Como por ejemplo: https://gist.github.com/mikermcneil/8366092 )

Puedes añadir esta exportación:

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

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

siguiente(); };

y luego en la vista:

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

0) {%>

Puedes crear mensajes en el controlador así:

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