在我的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错误消息?
谢谢!
答案 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派生的错误消息。
继承了错误属性。
它还支持以下方法:
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);