【问题标题】:javascript async/await unhandledRejection not triggeredjavascript async/await unhandledRejection 未触发
【发布时间】: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


【解决方案1】:

我认为 HapiJS 捕获了您的请求处理程序的错误。

查看代码 - 似乎是错误 catched there

不确定以何种格式以及在何种条件下进一步重新抛出。

无论如何我都不会依赖框架来实现这种逻辑,并且至少用自己的包装器包装所有处理程序并在那里记录所有错误。

【讨论】:

    【解决方案2】:

    我最终实现了一个 PreResponse 挂钩,该挂钩将检查响应是否为错误并采取相应措施

    server.ext('onPreResponse', (request, h) => {
                const response = request.response;
                if (!response.isBoom) {
                    return h.continue;
                }
    
                let error = response;
                if (!error.message && error.output && error.output.payload) {
                    return error.output.payload;
                }
    
                error = new Error(error.message);
                return Boom.boomify(error, {statusCode: 400});
            });
    

    【讨论】:

      猜你喜欢
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2023-01-30
      • 2017-06-09
      • 2022-01-24
      • 2018-06-27
      相关资源
      最近更新 更多