使用validate.js解决所有异步承诺

时间:2017-01-27 05:11:35

标签: node.js promise validate.js

我使用此库进行验证:https://validatejs.org/#validate-async

我有一种相当复杂的方法来验证嵌套对象对自己的架构。请参阅下面的相关代码。

基本上,它会:

  1. 为每个嵌套对象创建一个异步承诺。
  2. 然后致电Promise.all以解决或拒绝验证。
  3. 除了一个问题外,它运作良好。使用默认的承诺库Promise.all"快速失败"所以在后面的快速中间件中的catch处理程序中,它只接收第一个失败的promise的结果。但是为了让我的验证员工作,我需要结合所有失败的承诺的结果。

    是否有替代承诺库(A +兼容),我可以交换到验证器,以便我捕获所有错误?

    ValidationAdapter.prototype.validateCreateCtrl = function(req, res, next){
      var obj = {};
      var self = this;
      this.logger.debug("Validating " + self.config.modelName + " create request");
      self.fieldList.forEach(function(fieldName){
        obj[fieldName] = req.body[fieldName];
      });
    
      self._resolveObjectRefs(obj);
    
      this.logger.debug("Composed request object " + JSON.stringify(obj, null, 2));
    
      var Promises = [];
      Promises.push(validate.async(obj, self.constraints));
    
      Object.keys(self.embeddedConstraints).forEach(function (key){
        var value = obj[key];
        var constraints = self.embeddedConstraints[key];
        if (value.constructor === Array){
          var i = 0;
          value.forEach(function(newVal){
            Promises.push(validate.async(newVal, constraints, {path: key + "[" + i + "]."}));
            i++;
          });
        }else{
          Promises.push(validate.async(value, constraints, {path: key}))
        }
      });
    
      // by default it should fall through
      Promise.all(Promises).then(function(){
        return next();
      }).catch(next);
    };
    

1 个答案:

答案 0 :(得分:3)

您可以使用蓝鸟的反思来实施settleAll

Promise.all(Promises.map(function(promise) {
    return promise.reflect();
})).each(function(inspection) {
    if (inspection.isFulfilled()) {
        console.log("Success...");
    } else {
        console.error("Reject...");
    }
});

http://bluebirdjs.com/docs/api/reflect.html#reflect

相关问题