2017-01-27 4 views
1

私は検証のためにこのライブラリを使用しています:https://validatejs.org/#validate-asyncvalidate.jsですべての非同期の約束を解決してください

私は、自分のスキーマに対してネストされたオブジェクトを検証するかなり複雑な方法を持っています。以下の関連コードを参照してください。

基本的に、それがされます:

  1. は、ネストされた各オブジェクトの非同期約束を作成します。
  2. 次に、Promise.allを呼び出して検証を解決または拒否します。

1つの問題以外はうまくいきます。デフォルトの約束ライブラリPromise.allは、後で明示的なミドルウェアにあるキャッチハンドラで「高速で失敗する」ため、最初に失敗した約束からの結果しか受け取りません。しかし、私のバリデーターが働くには、失敗した約束事の結果を組み合わせる必要があります。

私はすべてのエラーをキャプチャできるバリデーターに入れ替えることができる別の約束ライブラリ(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); 
}; 

答えて

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

+0

OKおかげで、私はそれを使用していました。 –

関連する問題