#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-errors3. О, это блестяще. Спасибо за это!
4. Похоже, это игнорируется. Мне пришлось поставить явную проверку на наличие кодов состояния, превышающих 400, на карте внутри канала. Я выбрасываю оттуда. Это не идеально, но это то, что я бы сделал с обещанием, так что все в порядке. Спасибо!
Ответ №2:
Здравствуйте, вы можете попробовать также подобным образом получить значение с помощью rxjs из запроса
const { data } = await lastValueFrom(
this.httpService.get(`${process.env.URL}/users`, {
headers: {
Authorization: authorization,
},
}),
);