自定义 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);
在我的 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);