数据:如果抛出错误,则在hapi.js preResponse中为null

时间:2019-06-12 07:42:46

标签: node.js hapi

我在模式代码中的某处抛出了这样的错误:

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

1 个答案:

答案 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错误。