【问题标题】:sails.js/waterline validation error handligsails.js/waterline 验证错误处理
【发布时间】:2015-10-31 01:03:44
【问题描述】:

我对如何从水线管理错误验证感到很困惑,我需要对良好做法进行一些说明。 通常我有这样的承诺链:

  sails.models.user.findOne(...)
  .then(function(){
      //...
      //...
      return sails.models.user.update(...);
  })
  .then(....)
  .then(....)
  .catch(function(err){

  })

出现的一个问题是当水线返回验证错误时。在这种情况下,我通常需要知道问题是由客户端输入错误或代码中的错误产生的。

我最终要做的是将水线承诺包装在正确处理验证错误的承诺中。所以最终的代码是:

  ...
  .then(function(){
      //...
      //...
      return new Promise(function(resolve,reject){
        sails.models.user.update(...)
        .then(resolve)
        .catch(function(err){
            //the error is a bug, return the error object inside the waterline WLError
            reject(err._e);

            //the error is caused by wrong input, return the waterline WLError
            reject(err);
        })
      })
  })
  .then(function(){
        //second example: we are sure that a validation error can't be caused by a wrong input
        return wrapPromise(sails.models.user.find());
  })
  .then(....)
  .catch(function(err){
      //WLError ---> res.send(400);
      //Error object --> res.send(500);
  })


  function wrapPromise(action){
      //return an error object on validation error
      return new Promise(function(resolve,reject){
          action
          .then(resolve)
          .catch(function(err){
              reject(err._e || err);
          })
      })
  }

我做事正确吗?有没有更好的方法来正确处理错误? 谢谢

【问题讨论】:

  • 避免使用Promise constructor antipattern!只是在catch 回调中的throw 而不是调用reject()
  • @Bergi 我认为需要reject(err._e || err) 来检查err._e 是否存在。第一个reject(err._e)可以换成throw err._e,但是应该一样
  • 不,可能需要||,但不需要reject() 调用。你应该只是在做return ….catch(function(err) { throw err._e || err; });
  • 如果您遇到错误,也可以访问 Sails.js Gitter 页面。我在那里找到了一些帮助,而且我对编码很陌生。 Gitter

标签: node.js validation promise sails.js waterline


【解决方案1】:

您可以简单地在 catch 中添加一个检查来区分验证和其他错误:

sails.models.user.findOne(...)
  .then(function(){
      //...
      //...
      return sails.models.user.update(...);
  })
  .then(....)
  .then(....)
  .catch(function(err){
      if(err.error == "E_VALIDATION") {
          // validation error
      }
  })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 2014-04-09
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 2017-08-19
    • 2017-07-04
    • 1970-01-01
    相关资源
    最近更新 更多