如何使用 NestJS 重新抛出 HttpService 调用错误?

Cha*_*haz 15 javascript observable typescript axios nestjs

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

return this.httpService.post(...)
  .pipe(
    map(response => response.data),
  );
Run Code Online (Sandbox Code Playgroud)

这在调用成功时正常工作;但是,如果出现错误 (4xx),我该如何正确返回状态和错误消息?

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

Kim*_*ern 21

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

import { catchError } from 'rxjs/operators';

this.httpService.get(url)
      .pipe(
        catchError(e => {
          throw new HttpException(e.response.data, e.response.status);
        }),
      );
Run Code Online (Sandbox Code Playgroud)

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

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

  • @JimWharton您应该能够使用“validateStatus”自定义此行为,请参阅https://github.com/axios/axios#handling-errors (2认同)