2017-01-27 6 views
1

Ich verwende diese Bibliothek für die Validierung: https://validatejs.org/#validate-async.Lösen Sie alle asynchronen Versprechen mit validate.js

Ich habe eine ziemlich komplizierte Möglichkeit, verschachtelte Objekte gegen ihr eigenes Schema zu validieren. Siehe den entsprechenden Code unten.

Grundsätzlich wird:

  1. erstellen für jedes verschachtelte Objekt ein asynchrones Versprechen.
  2. Rufen Sie dann Promise.all auf, um die Validierungen aufzulösen oder abzulehnen.

Es funktioniert gut, außer ein Problem. Mit der Standard-Verspre- chen-Bibliothek Promise.all "Failed Fast", also im Catch-Handler, der in späteren Express-Middleware ist, erhält es nur Ergebnisse vom ersten fehlgeschlagenen Versprechen. Aber damit meine Prüfer arbeiten können, muss ich die Ergebnisse aller fehlgeschlagenen Versprechen kombinieren.

Gibt es eine alternative Zusicherungsbibliothek (A + -kompatibel), die ich in den Validator tauschen könnte, damit ich alle Fehler erfassen kann?

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); 
}; 

Antwort

3

können Sie die drossel die Nutzung widerspiegeln settleAll implementieren:

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 danke ich es benutzt. –

Verwandte Themen