自定义繁殖错误消息

时间:2017-07-18 23:50:13

标签: javascript node.js hapi.js

在我的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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

根据Hapijs documentation,您可以重新格式化错误消息以对其进行自定义:

错误转换

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

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

  • 消息 - 错误消息。

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

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

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

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

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

      • 错误 - HTTP状态消息(例如“错误请求”,“内部服务器” 错误')从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);