【问题标题】:How to add custom paramater in error object lb4?如何在错误对象 lb4 中添加自定义参数?
【发布时间】:2019-09-20 21:22:13
【问题描述】:

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

【问题讨论】:

  • 发布您的代码并查看如何在 stackoverflow 上提问。
  • 已更新,请查收。

标签: node.js api strongloop lookback


【解决方案1】:

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

构建 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 可以很容易地按照你的方式格式化错误消息。只需提供序列操作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 来跟踪这一点。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      相关资源
      最近更新 更多