自定义Boom错误消息

6

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

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

这将返回一个类似于以下的信息提示框:
{
  "statusCode": 401,
  "error": "Unauthorized",
  "message": "unauthorized access to this API."
}

我想要将其定制,使其外观更像这样:

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

我们是否可以自定义Boom错误信息?

谢谢!

2个回答

6

Boom内置响应错误转换,所以为了达到我的目的,我需要按以下方式重新格式化错误回复:

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);

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

错误转换

通过更改输出内容可以自定义错误。boom 错误对象包括以下属性:

  • isBoom - 如果为 true,则表示这是一个 Boom 对象实例。

  • message - 错误消息。

  • output - 格式化的响应。可以在对象构建后直接操作以返回自定义错误响应。允许的根键:

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

    • headers - 包含任何 HTTP 标头的对象,其中每个键是标头名称,值是标头内容。

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

      • statusCode - HTTP 状态码,派生自 error.output.statusCode。

      • error - HTTP 状态消息(例如 'Bad Request'、'Internal Server Error'),由 statusCode 派生。

      • message - 由 error.message 派生的错误消息。

  • 继承的错误属性。

它还支持以下方法:

  • reformat() - 使用其他对象属性重建 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扩展点来识别错误并将其替换为不同的响应对象。

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);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接