我们有一个 Express API 应用程序,我们在其中利用 ES6 的原生 Promise。
我们当前的简单获取设置是
//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)
});
我们看到的问题是,记录的 err.stack 仅包含来自 db Node 模块的跟踪。我希望跟踪包含controller.js 调用repository.js 的事实。
我知道我可以拒绝(new Error(err)),而不是拒绝(err),但我不确定这是否是我们应用程序中的一个好习惯
最佳答案
希望这对您有帮助。
Calls to next() and next(err) indicate that the current handler is complete and in what state. next(err) will skip all remaining handlers in the chain except for those that are set up to handle errors.
所以你的 controller.js
需要像这样 -
//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);
});
}
关于node.js - 使用 Node.js 和 native Promise 构建堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40410432/