-1

我正在使用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"
  }
}
4

2 回答 2

2

在https://github.com/strongloop/loopback-next/issues/1867#issuecomment-434247807中交叉发布我在 GitHub 上给出的答案

构建 HTTP 错误响应是一项棘手的工作。很容易出错并让您的应用程序受到攻击。

在 LoopBack(3.x 和 4.x)中,我们使用我们的强错误处理程序中间件来处理这个问题。请参阅我们的文档中的处理错误

以下是需要牢记的重要安全限制:

在生产模式下,strong-error-handler省略错误响应中的细节以防止泄露敏感信息:

  • 对于 5xx 错误,输出仅包含 HTTP 规范中的状态代码和状态名称。
  • 对于 4xx 错误,输出包含完整的错误消息 ( ) 和属性 ( )error.message的内容,该属性通常用于提供有关验证问题的机器可读详细信息。它还包括允许传递机器可读的错误代码,例如用于翻译。detailserror.detailsValidationErrorerror.code

在调试模式下,strong-error-handler在 HTTP 响应中向客户端返回完整的错误堆栈跟踪和任何错误对象的内部详细信息。

既然我已经警告过你,LoopBack 4 可以很容易地按照你的方式格式化错误消息。只需提供 Sequence 操作的自定义实现reject。请参阅我们的文档中的自定义序列操作,它解释了如何创建自定义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来跟踪它。

于 2019-05-10T13:54:01.323 回答
0

我尝试将错误对象添加到新对象中。

                       let error = new Error();
                        error.name = 'Invalid_OTP_AttemptsError';
                        error.status = 422;
                        error.message = 'You’ve exceeded the maximum number of One-Time Password (OTP) attempts';
                        let data={...error};
                        data.retryCount=foundMb.retryCount
                        data.resendCount=foundMb.resendCount
                        return callback(null,data);
于 2021-12-21T06:47:29.867 回答