【问题标题】:How to rethrow errors of HttpService call with NestJS?如何用 NestJS 重新抛出 HttpService 调用的错误?
【发布时间】:2019-08-31 06:27:08
【问题描述】:

我正在使用 NestJS 实质上使用 HttpService(一个可观察的包装 Axios 库)将请求代理到另一个 api。例如:

return this.httpService.post(...)
  .pipe(
    map(response => response.data),
  );

调用成功时,此功能正常;但是,如果出现错误(4xx),如何正确返回状态和错误消息?

我已经想出了如何使用 Promise 来做到这一点,但如果可能的话,我想留在可观察的范围内。

【问题讨论】:

    标签: javascript typescript observable axios nestjs


    【解决方案1】:

    您可以使用catchError 重新抛出带有相应状态码的异常:

    import { catchError } from 'rxjs/operators';
    
    this.httpService.get(url)
          .pipe(
            catchError(e => {
              throw new HttpException(e.response.data, e.response.status);
            }),
          );
    

    请注意,error.response 可能为空,请参阅axios docs 了解所有要检查的错误情况。

    此外,axios 不会抛出 4xx 错误,因为它们可能是预期的并且来自 API 的有效响应。您可以通过设置validateStatus 来自定义此行为,请参阅docs。

    【讨论】:

    • 奇怪的是,我可以通过这个管道发送一个代码为 401 的 AxiosError 并且它永远不会捕获。所有 400 级错误都被视为“成功”。
    • @JimWharton 您应该可以使用validateStatus 自定义此行为,请参阅github.com/axios/axios#handling-errors
    • 哦,太棒了。谢谢!
    • 看起来这被忽略了。我不得不在管道内的地图中明确检查大于 400 的状态代码。我从那里扔。这并不理想,但这是我对 Promise 所做的,所以没关系。谢谢!
    猜你喜欢
    • 2019-01-25
    • 2020-04-16
    • 1970-01-01
    • 2022-09-23
    • 2020-03-12
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多