自定义 Boom 错误消息

Custom Boom error messages

在我的 Hapi.js 服务器上,如果帐户没有访问 api 端点的权限,我想发送一条特定消息。我现在收到的 Boom 消息如下所示:

return reply(Boom.unauthorized("unauthorized access to this API."));

这 returns 一封看起来像这样的邮件:

{
  "statusCode": 401,
  "error": "Unauthorized",
  "message": "unauthorized access to this API."
}

我想让它更个性化,看起来像这样:

{
  "success": false,
  "message": "unauthorized access to this API.",
  "csrf-decorator": "",
  "redirect": ""
}

我们可以自定义 Boom 错误消息吗?

谢谢!

Boom 带有内置响应 error transformation。因此,为了实现我的结果,我按照以下方式重新格式化了我的错误回复:

const error = Boom.forbidden("Sorry, you are restricted in accesssing this API. No soup for you!.");
error.output.statusCode = 403;    // Assign a custom error code
error.output.payload["csrf-decorator"] = request.headers["csrf-decorator"];
error.reformat();
return reply(error);

根据 Hapijs documentation 您可以重新格式化错误消息以自定义它们:

转换错误

可以通过更改输出内容来自定义错误。繁荣错误 object 包括以下属性:

  • isBoom - 如果为真,表示这是一个 Boom object 实例。

  • message - 错误信息。

  • output - 格式化的响应。 object构造后可以直接操作到return自定义错误响应。允许的根密钥:

  • statusCode - HTTP 状态代码(通常为 4xx 或 5xx)。

    • headers - 包含任何 HTTP headers 的 object,其中每个键是一个 header 名称,值是 header 内容.

    • payload - 格式化的 object 用作响应有效负载(字符串化)。可以直接操作,但如果调用 reformat() ,任何更改都将丢失。允许的任何内容,默认情况下包括以下内容:

      • statusCode - HTTP 状态代码,源自 error.output.statusCode.

      • 错误 - HTTP 状态消息(例如 'Bad Request'、'内部服务器 错误') 来自 statusCode.

      • message - 来自 error.message.

      • 的错误消息
  • 继承错误属性。

还支持以下方式:

  • reformat() - 使用其他 object 属性重建 error.output。

const Boom = require('boom');

const handler = function (request, h) {
    const error = Boom.badRequest('Cannot feed after midnight');
    error.output.statusCode = 499;    // Assign a custom error code
    error.reformat();
    error.output.payload.custom = 'abc_123'; // Add custom key
    throw error;
});

当需要不同的错误表示时,例如 HTML 页面或不同的负载格式,onPreResponse 扩展点可用于识别错误并用不同的响应替换它们 object.

const Hapi = require('hapi');
const Vision = require('vision');

const server = Hapi.server({ port: 80 });
server.register(Vision, (err) => {
    server.views({
        engines: {
            html: require('handlebars')
        }
    });
});

const preResponse = function (request, h) {

    const response = request.response;
    if (!response.isBoom) {
        return h.continue;
    }

    // Replace error with friendly HTML

      const error = response;
      const ctx = {
          message: (error.output.statusCode === 404 ? 'page not found' : 'something went wrong')
      };

      return h.view('error', ctx).code(error.output.statusCode);
};

server.ext('onPreResponse', preResponse);