2016-11-03 2 views
2

Wir haben eine Express-API-Anwendung, in der wir die ES6-Versprechen nutzen.Erstellen Sie einen Stack-Trace mit node.js und nativen Versprechungen

Unsere aktuellen Setup für eine einfache get wäre

//controller.js snippet 
get: function (req, res, next) { 
     repository.getObject() 
     .then(function (response) { 
      return res.status(200).json(response); 
     }).catch(function (err) { 
      return next(err); 
     }); 
} 

//repository.js snippet 
getObject:function(){ 
    return new Promise(function (resolve, reject) { 
     var sql = SELECT * FROM table; 
     db.query(sql, function (err, result) { 
      if (err) return reject(err); 
      return resolve(result.rows)); 
     }); 
    }); 
} 

//app.js snippet 
app.use(function (err, req, res, next) { 
    logger.log(err, err.stack) 
}); 

Das Problem, das wir sehen, ist, dass die err.stack, die nur protokolliert wird die Spur von dem db Knotenmodul enthält. Ich möchte, dass der Trace die Tatsache mit einbezieht, dass controller.js repository.js heißt.

Anstatt ablehnen (err) Ich weiß, dass ich (neu Error (err)) ablehnen tun können, aber ich bin nicht sicher, ob das eine gute Praxis ist

alle über unsere Anwendung hat

Antwort

0

Ich hoffe, dies wird dazu beitragen, Sie.

Anrufe zu next() und nächsten (err) zeigen an, dass die aktuelle Prozedur vollständig und in welchem ​​Zustand ist. nächste (Fehler) wird überspringen alle verbleibenden Handler in der Kette außer für diejenigen, die eingerichtet sind, Fehler zu behandeln.

So Ihre controller.js Bedürfnisse wie this-

//controller.js snippet 
get: function (err, req, res, next) { 
    repository.getObject() 
    .then(function (response) { 
     return res.status(200).json(response); 
    }).catch(function (err) { 
     return next(err); 
    }); 
} 
+0

@pieman zu sein braucht es Ihr Problem zu lösen? – WitVault

+0

Der Kern des Problems ist, dass wir Funktionen haben, die Versprechen zurückgeben, die andere Funktionen aufrufen, die Versprechen versprechen. Wenn die letzte Funktion, eine Versprechensfehler zurückzugeben, wird es unsere Versprechenskette ablehnen und "sprudeln". Die Stack-Ablaufverfolgung, die diesem Fehler zugeordnet ist, verweist nur auf die Funktion, die fehlerhaft ist, und nicht darauf, wie sie dorthin geht. Ich bin mir nicht sicher, wie die obige Lösung mit einer tieferen Versprechungskette funktionieren wird. Ist es eine schlechte Übung, diese Versprechen so verschachtelt wie wir? – pieman

+0

Es ist vollkommen richtig, Funktionen zu haben, die Versprechungen zurückgeben und eine andere Funktion aufrufen, die vielversprechend ist. Bei gemeinsam verketteten Versprechungen können Sie entweder in jeder 'then'-Kette einen Error-Handler bereitstellen und von dort aus den Fehler erneut ausgeben, oder Sie können nur einen Error-Handler am Ende der Versprechungskette haben. – WitVault

Verwandte Themen