sails.js 0.10.0-rc4无法将消息刷新到ejs视图

时间:2014-03-07 07:28:00

标签: node.js express sails.js

在服务器js中

 if (!user) {
      if (isEmail) {
        req.flash('error', 'Error.Passport.Email.NotFound');
        sails.log.warn('User Email not fond.');
      } else {
        req.flash('error', 'Error.Passport.Username.NotFound');
        sails.log.warn('User name not found.');
      }

ejs view

<form role="form" action="/auth/local" method="post">
    <input type="text" name="identifier" placeholder="Username or Email">
    <input type="password" name="password" placeholder="Password">
    <button type="submit">Sign in</button>
</form>

<% if (typeof message!== 'undefined') { %>
<%= message %>
<% } else { %>
You E-mail and passport is correct!
<% } %>

如果我输入了一个错误的电子邮件或护照,ejs视图不显示任何错误消息,为什么? 如何将错误消息刷新到ejs视图?我做错了什么? 抱歉我的英语不好。 THX。

4 个答案:

答案 0 :(得分:3)

实际上,req会自动传递到您的视图,因此在您的视图中,您可以这样做:

<%- req.flash('message') %>

您无需手动将消息传递到视图。

答案 1 :(得分:1)

Flash中间件将flash消息存储在会话中。您仍然必须将它传递给您的视图并自行呈现:

app.get('/flash', function(req, res){
  // Set a flash message by passing the key, followed by the value, to req.flash().
  req.flash('info', 'Flash is back!')
  res.redirect('/');
});

app.get('/', function(req, res){
  // Get an array of flash messages by passing the key to req.flash()
  res.render('index', { messages: req.flash('info') });
});

答案 2 :(得分:1)

使用req.session.flash检查邮件是否存在导致undefined错误在Sailsjs v0.10.0-rc8中。

以下是我最终使用的解决方案:

  <% var errors = req.flash('error'); %>
    <% if ( Object.keys(errors).length > 0 ) { %>
    <div class="alert alert-danger">
      <button type="button" class="close" aria-hidden="true" data-dismiss="alert">&times;</button>
      <ul>
        <% Object.keys(errors).forEach(function(error) { %>
          <li><%- JSON.stringify(errors[error]) %></li>
        <% }) %>
      </ul>
    </div>
   <% } %>

<强>更新

我在阅读消息之前想出了如何检查flash消息是否存在:

   <% if (req.session.flash && req.session.flash.error) { %>
      <% var errors = req.flash('error') %>
      <div class="alert alert-danger">
        <button type="button" class="close" aria-hidden="true" data-dismiss="alert">&times;</button>
        <ul>
          <% Object.keys(errors).forEach(function(error) { %>
            <li><%- JSON.stringify(errors[error]) %></li>
          <% }) %>
        </ul>
      </div>
   <% } %>

答案 3 :(得分:0)

我发现以下自定义验证要点使用上述方法更有帮助。我想你最终还是会在某个时候想要自定义验证消息,对吧?

https://gist.github.com/basco-johnkevin/8436644

注意:我创建了一个名为api / services / ValidationService.js的文件,并在此处放置了gist代码。这样我就不必在Controller中要求它了。

在控制器中:

create: function(req, res, next) {
    //Create a User with the params sent from the signup form
    //
    User.create( req.params.all(), function userCreated( err, user ) {
        // If there's an error
        // 
        if(err) {
            if(err.ValidationError) {
                errors = ValidationService.transformValidation(User, err.ValidationError);
                sails.log.warn(errors);
                req.flash('error', errors);
            }

            // If error redirect back to the sign-up page
            return res.redirect('/user/new');
        }

        // After successfully creating the user 
        // redirect the to the show action
        res.json(user);
    });
}

在我的用户模型中:

module.exports = {

  schema: true,

  attributes: {
    name: {
        type: 'string',
        required: true
    },

    title: {
        type: 'string'
    },

    email: {
        type: 'string',
        email: true,
        required: true,
        unique: true
    },

    encryptedPassword: {
        type: 'string',
        minLength: 6,
        required: true
    }

  },

  validation_messages: {
    name: {
        required: 'You must supply a valid name.'
    },

    email: {
        email: 'You must supply a valid email address.',
        required: 'You must supply a valid email address.',
        unique: 'An account with this email address already exists.'
    },

    encryptedPassword: {
        minLength: 'Your password must be atleast 6 characters long.',
        required: 'You must supply a password that is atleast 6 characters long.'
    }
  }

};

这就是我在用户注册表单视图中的结果。嗯......一定有更好的方法。

<% if (req.session.flash && req.session.flash.error) { %>
  <% var errors = req.flash('error') %>
  <div class="alert alert-danger">
    <button type="button" class="close" aria-hidden="true" data-dismiss="alert">&times;</button>
    <ul>
      <% Object.keys(errors).forEach(function(error) { %>
        <% Object.keys(errors[error]).forEach(function(error_message) { %>
        <% Object.keys(errors[error][error_message][0]).forEach(function(error_message_res) { %>
        <li>
            <%- errors[error][error_message][0][error_message_res] %>
        </li>
        <% }); %>
        <% }); %>
      <% }); %>
    </ul>
  </div>