【发布时间】:2018-07-30 07:18:52
【问题描述】:
我正在使用 HapiJS 开发一个 RESTful API。
我正在使用 HapiJS v17 来利用 async/await。
我的意图是不在每个路由中处理异常,而是有一个集中的地方来处理所有 unhandledRejection。
我试图实现这一点的方法是在服务器启动时尽早收听unhandledRejection 事件。
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at:', p, 'reason:', reason);
});
然后例如,在我的业务逻辑代码中,我故意不捕获被拒绝的承诺(例如数据库错误),希望我能够在process.on('unhandledRejection'的回调中处理它
但是console.log 语句永远不会被触发。
例如:
handler: async (request, h) => {
const user = request.user;
const userIdToUpdate = request.params.id;
const firstName = request.payload.firstName;
const lastName = request.payload.lastName;
const roles = request.payload.roles;
const updatedUser = await UserCtrl.updateUser(userIdToUpdate, firstName, lastName, roles, user.tenantId.toString());
const response = h.response(updatedUser.sanitize());
response.type('application/json');
return response;
}
UserCtrl.updateUser 返回一个 Promise,假设数据库连接断开,我假设 Promise 应该被拒绝,但为什么 process.on('unhandledRejection', (reason, p) => { 没有被触发?
【问题讨论】:
-
为什么要在一个地方处理所有错误,如果您想在收到错误后执行任何其他操作。
-
“UserCtrl.updateUser”引发的错误将“上升”到“处理程序”返回的 Promise。你是否也跳过了这个函数的错误捕获?
-
那么每当我想做一些自定义的事情时,我都会添加一个 try catch
-
你如何使用处理程序?
-
似乎 HapiJS 对 'handler' 调用的结果有 'catch' - 因此没有触发 'unhandledRejection' 事件
标签: javascript node.js async-await es6-promise hapijs