我在模式代码中的某处抛出了这样的错误:
throw new Error({
name: 'notFound',
message: 'Book not found'
});
我有一个onPreResponse
服务器扩展名:
server.ext('onPreResponse', async ({ response }, h) => {
if (isErrorResponse(response)) {
// So, here the "data" property is null and I can not access name and message
console.dir(response);
}
return h.continue;
});
由于数据为空,因此无法访问我的姓名和消息。但是,如果我抛出普通对象,我将拥有这两个属性。尽管那将是一个偶然的错误Cannot throw non-error object
答案 0 :(得分:0)
在没有太多关于通过onPreResponse捕获错误的意图的知识的情况下,这里可能会考虑一些事情
https://hapijs.com/api#-requestresponse
设置后的响应对象。该对象可以修改,但不能修改 被分配另一个对象。用另一个来自的响应替换 在扩展点内,返回新的响应值。包含空值 未设置响应时(例如,请求终止时) 客户端断开连接时过早。
因此,数据为空是预期的行为,因此我了解您希望以某种方式丰富错误。现在,您正在尝试引发Hapi中引发的错误,该错误会自动转换为Boom object,而错误构造不正确,请参见Error constructor docs第一个参数是一条错误消息,不是自定义对象。相反,您可以使用Boom错误,该错误是构造函数允许您在其中放置自定义数据的,例如
throw new Boom('Book not found', { statusCode: 404, decorate: { custom: 'custom' } });
因此,如果您扔掉那一个,应该会看到以下属性
{
"data": null,
"isBoom": true,
"isServer": false,
"output": {
"statusCode": 404,
"payload": {
"statusCode": 404,
"error": "Not Found",
"message": "Book not found"
},
"headers": {}
},
"custom": "custom"
}
您现在可以添加一些日志记录来检查响应是否为错误(if(response.isBoom)),并读取错误所传递的自定义信息。无论如何,我确实认为最好不要在onPreResponse扩展中使用这种类型的逻辑,我会尝试使用更常见的错误处理方法,将更深层的冒泡错误发送到请求处理程序,并从那里返回适当的Boom错误。