Как перенаправить ошибки вызова HTTPService с помощью NestJS?

#javascript #typescript #observable #axios #nestjs

#javascript #typescript #наблюдаемый #axios #nestjs

Вопрос:

Я использую NestJS, по сути, для прокси-запроса к другому API, используя HttpService (наблюдаемую обернутую библиотеку Axios). Например:

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

Это работает правильно, когда вызов выполнен успешно; однако, если есть ошибка (4xx), как мне правильно вернуть статус и сообщение об ошибке?

Я понял, как это сделать с помощью promises, но, если возможно, я хотел бы оставаться в пределах наблюдаемого.

Ответ №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 может быть null, см. Документы axios для проверки всех случаев ошибок.

Кроме того, axios не выдает ошибки 4xx, поскольку они могут быть ожидаемыми и допустимыми ответами от API. Вы можете настроить это поведение, установив validateStatus , см. Документы.

Комментарии:

1. Как ни странно, я могу отправить AxiosError с кодом 401 через этот конвейер, и он никогда не перехватывается. Все ошибки уровня 400 считаются «успешными».

2. @JimWharton Вы должны иметь возможность настраивать это поведение с validateStatus помощью, см. github.com/axios/axios#handling-errors

3. О, это блестяще. Спасибо за это!

4. Похоже, это игнорируется. Мне пришлось поставить явную проверку на наличие кодов состояния, превышающих 400, на карте внутри канала. Я выбрасываю оттуда. Это не идеально, но это то, что я бы сделал с обещанием, так что все в порядке. Спасибо!

Ответ №2:

Здравствуйте, вы можете попробовать также подобным образом получить значение с помощью rxjs из запроса

 const { data } = await lastValueFrom(
  this.httpService.get(`${process.env.URL}/users`, {
    headers: {
      Authorization: authorization,
    },
  }),
);