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
@pieman zu sein braucht es Ihr Problem zu lösen? – WitVault
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
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