5

在我的 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 错误消息?

谢谢!

4

2 回答 2

5

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);
于 2017-07-19T04:58:44.723 回答
2

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

错误转换

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

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

  • message - 错误消息。

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

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

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

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

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

      • error - 从 statusCode 派生的 HTTP 状态消息(例如“错误请求”、“内部服务器错误”)。

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

于 2018-03-09T21:44:43.600 回答