使用 AxiosRequestConfig 的 validateStatus 函数处理 Nestjs HttpService 错误

Nestjs HttpService error handling with AxiosRequestConfig's validateStatus function

我需要处理使用 HttpService(Nestjs 的 HttpModule)使用外部服务时可能发生的 http 错误状态代码(例如 401、500 等)。这是我正在处理的实现:

import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { Logger } from '@nestjs/common';
import { AxiosRequestConfig } from 'axios';
import { catchError, firstValueFrom, map } from 'rxjs';

type Person = {
  name: string;
  lastName: string;
};

@Injectable()
export class PersonService {
  constructor(private httpService: HttpService) {}
  async findPerson(): Promise<Person> {
    const axiosConfig: AxiosRequestConfig = {
      method: 'get',
      url: 'https://service.dns/path/person',
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Bearer ${jwt}`,
      },
      validateStatus: function (status: number) {
        return status === 200;
      },
    };

    const personInstance: Person = await firstValueFrom(
      this.httpService.request(axiosConfig).pipe(
        catchError((e) => {
          Logger.error(e.response.data.errorMessage);
          throw new Error('internal communication error');
        }),
        map((res) => {
          return res.data;
        }),
      ),
    );
    return personInstance;
  }
}

在上面的代码中,我只需要函数 catchError 抛出自定义错误,但我无法让函数 validateStatus 触发 catchError 的执行。

我已经实现了下一个代码,以便利用 AxiosRequestConfigvalidateStatus 功能来满足我的需求:

import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { Logger } from '@nestjs/common';
import { AxiosRequestConfig } from 'axios';
import { firstValueFrom } from 'rxjs';

type Person = {
  name: string;
  lastName: string;
};

@Injectable()
export class PersonService {
  constructor(private httpService: HttpService) {}
  async findPerson(): Promise<Person> {
    const axiosConfig: AxiosRequestConfig = {
      method: 'get',
      url: 'https://service.dns/path/person',
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Bearer fake_jwt`,
      },
      validateStatus: function (status: number) {
        return status === 200;
      },
    };

    return firstValueFrom(this.httpService.request(axiosConfig))
      .then((res) => res.data)
      .catch((e) => {
        Logger.error(e.errorMessage);
        throw new Error('internal communication error');
      });
  }
}

注意:此代码处理Promise<AxiosResponse<any>>而不是Observable<AxiosResponse<any>方法