node.js - Nestjs HttpService feilhåndtering med AxiosRequestConfigs validateStatus-funksjon


Jeg trenger å håndtere HTTP-feilstatuskoder (som 401, 500, osv.) som kan oppstå når jeg bruker en ekstern tjeneste med HttpService (HttpModule i Nestjs). Her er implementeringen jeg jobber med:

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

I koden ovenfor trenger jeg bare at funksjonen catchError kaster den tilpassede feilen, men jeg klarer ikke å få funksjonen validateStatus til å utløse kjøringen av catchError.

Svar #1

Jeg har implementert følgende kode for å dra nytte av validateStatus-funksjonen i AxiosRequestConfig for å gi en løsning på mine behov:

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

Merk: denne koden håndterer Promise<AxiosResponse<any>> i stedet for Observable<AxiosResponse<any>-metoder

Relaterte artikler