Javascript 如何处理Sails JS返回的验证消息?

Javascript 如何处理Sails JS返回的验证消息?,javascript,validation,sails.js,Javascript,Validation,Sails.js,希望你做得很好 我正在开发SailsJS web应用程序,并使用控制器的操作结构 这是我的用户/登录操作: module.exports = { friendlyName: 'Login', description: 'Login user.', inputs: { email: { description: 'user email.', type: 'string', required: true

希望你做得很好

我正在开发SailsJS web应用程序,并使用控制器的操作结构

这是我的
用户/登录
操作:

  module.exports = {
    friendlyName: 'Login',

    description: 'Login user.',

    inputs: {
      email: {
        description: 'user email.',
        type: 'string',
        required: true
      },
      password: {
        description: 'user password.',
        type: 'string',
        required: true
      }
    },

    exits: {
      success: {
        statusCode: 200,
        responseType: 'view',
      },       
    },

    fn: async function (inputs, exits) {
      // All done.
      return 'hello world';
    }
  };
这是登录表单html代码:

    <div class="row">
      <div class="valign-wrapper">
          <div class="col s6 z-depth-4 card-panel">
            <form class="col s12 login-form" method="POST" action="/login">
              <input type="hidden" name="_csrf" value="<%= _csrf %>" />
              <div class="card-content">
                <h5 class="card-title center-align">Login</h5>
                <div class="row margin">
                  <div class="input-field col s12">
                    <input id="email" type="email" class="validate">
                    <label for="email">Email</label>
                    <div class="invalid-feedback" v-if="formErrors.emailAddress">Please provide a valid email address.</div>
                  </div>
                </div>
                <div class="row margin">
                  <div class="input-field col s12 right">
                    <input id="password" type="password" class="validate">
                    <label for="email">Password</label>
                  </div>
                </div>
                <div class="row">
                  <button class="btn waves-effect waves-light right" type="submit" name="action">Login</button>
                </div>            
              </div>
            </form>
          </div>
        </center>
      </div>
    </div>
现在的问题是,我找不到一种更漂亮的方法来处理这个错误

我希望你们中的一位能指引我走上正确的道路


谢谢,

使用相同的错误对象来显示将是一个错误,因为生产中的技术错误将通过toJson方法去除

处理错误的最佳方法是编写自定义错误。比如

  module.exports = {
    friendlyName: 'Login',

    description: 'Login user.',

    inputs: {
      email: {
        description: 'user email.',
        type: 'string'

      },
      password: {
        description: 'user password.',
        type: 'string'

      }
    },

    exits: {
      success: {
        statusCode: 200,
        responseType: 'view',
      },
      badrequest:{
        statusCode: 400,
        responseType: 'view',
      }
    },

    fn: async function (inputs, exits) {
      try{
       if(!inputs.email || !inputs.password){
       return exits.badrequest({code: 'PARAM_MISSING', message: 'Email/Password is missing'});
       }
        // all good
        return exits.success({/* object containing information realted to success*/});
      }
      catch(e){
         return exists.error(e);
        }
      }

    }
  };

您可以转换api/responses/badRequest中的错误

module.exports = async function badRequest(data) {
  const status = 400;

  if (data.code && data.code === 'E_MISSING_OR_INVALID_PARAMS'){
    return this.res.status(status).json({
      code: 'My code',
      message: 'My message',
      whateva: 'Bla bla'
    });
  }

  return this.res.status(status).json(data);
};
我有一个自定义项目,我需要你要求的相同的东西。我制作了一个npm包,它接受了一个错误对象,使前端更美观。大概是这样的:

module.exports = async function badRequest(data) {

  const formatError = require('myFormatError');
  const {status, response}= formatError(data);

  return this.res.status(status).json(response);

};


它不需要是npm,你可以做一些功能。我希望你正在寻找它。

我创建了一个钩子,可以解析这样的错误,并通过调用函数
sails.hooks.error.humanize(err)
向控制器中的响应添加一条可读的
errorMessage
。如果你愿意,我可以分享代码。您使用的是哪个版本的sails(它支持钩子吗)?我使用的是最新版本,1.0感谢您的努力,但讽刺的是,代码从未进入
fn:async function
,它甚至在进入之前就抛出错误。@BlueSuiter感谢您指出这一点。我能想到的唯一解决方案是删除所需的参数并手动测试它。否则,我认为您必须在视图本身中处理错误和消息。我已经根据它修改了代码。这意味着提供必需的参数只是为了愚弄开发人员。没用吗?@BlueSuiter帆船队有很多错误的决定。我认为,这只有在使用它返回JSON响应时才有用。作为API服务。感谢您的努力。您的代码片段处理得非常好。但是,我们可以将这些错误传递回视图吗?如果是,那么我们如何实现这一点呢?当然,您可以使用
returnres.view('pathToView',{error:response})。但您需要处理视图中的错误对象。我建议您对表单u发送进行一些客户端验证。
module.exports = async function badRequest(data) {

  const formatError = require('myFormatError');
  const {status, response}= formatError(data);

  return this.res.status(status).json(response);

};