首页 文章

javascript async / await unhandledRejection未触发

提问于
浏览
0

我正在使用HapiJS开发RESTful API .

我正在使用HapiJS v17来利用异步/等待 .

我的意图是不处理每条路线中的异常,而是集中处理所有 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,让's say the database connection is down, I' m假设Promise应该被拒绝,但为什么 process.on('unhandledRejection', (reason, p) => { 没有被触发?

2 回答

  • 1

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

    看代码 - 似乎错误catched there .

    不确定以什么格式和在什么条件下进一步重新投入 .

    我不会依赖于这种逻辑的框架,至少用自己的包装器包装所有处理程序并记录那里的所有错误 .

  • 0

    我最终实现了一个 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});
            });
    

相关问题