我正在使用Strongloop 4(lb4)。我面临一个问题,在错误对象中,我需要在错误对象中再添加一个自定义参数。
我希望在全球范围内使用它。对于每个错误,我想在每个错误消息中添加该自定义参数。
在loopback4中,全局错误处理由 src / sequence.ts 完成。
假设错误消息对象是
{
"error": {
"statusCode": 400,
"name": "xyz",
"message": "firstName is required"
}
}
我想要像这样的错误对象输出。
{
"error": {
"customParam" : "customParam",
"statusCode": 400,
"name": "xyz",
"message": "firstName is required"
}
}
答案 0 :(得分:1)
在https://github.com/strongloop/loopback-next/issues/1867#issuecomment-434247807
中交叉发布我在GitHub上给出的答案构建HTTP错误响应是一项艰巨的任务。容易出错并打开应用程序进行攻击。
在LoopBack(3.x和4.x)中,我们使用strong-error-handler中间件来解决此问题。请参阅我们文档中的Handling Errors。
以下是要牢记的重要安全约束:
在生产模式下,
strong-error-handler
忽略了错误响应中的详细信息,以防止泄露敏感信息:
- 对于5xx错误,输出仅包含HTTP规范中的状态代码和状态名称。
- 对于4xx错误,输出包含完整的错误消息(
error.message
)和details
通常用于提供计算机的error.details
属性(ValidationError
)的内容有关验证问题的可读详细信息。它还包括error.code
,以允许传递机器可读的错误代码,例如,该代码可用于翻译。在调试模式下,
strong-error-handler
在HTTP响应中将完整的错误堆栈跟踪和所有错误对象的内部详细信息返回给客户端。
现在,我已经警告您了,LoopBack 4使您很容易按照自己的方式格式化错误消息。只需提供Sequence操作reject
的自定义实现即可。请参阅我们文档中的Customizing Sequence Actions,它说明了如何创建自定义send
操作。 reject
的解决方案几乎相同,您只需要为动作函数使用不同的签名即可。
export class CustomRejectProvider implements Provider<Reject> {
// ...
action({request, response}: HandlerContext, error: Error) {
// handle the error and send back the error response
// "response" is an Express Response object
}
}
注意:LB4引发的某些错误仅设置了code
,这些错误需要进行一些预处理才能决定应触发哪些HTTP状态代码。 (例如,错误代码ENTITY_NOT_FOUND
应该映射到状态代码404
)。内置reject
操作尚未公开此预处理以供自定义拒绝操作使用。这是我们的疏忽,我创建了一个https://github.com/strongloop/loopback-next/issues/1942新刊物来对此进行跟踪。