[javascript] Axios의 http 오류에서 상태 코드를 얻는 방법은 무엇입니까?

이것은 어리석은 것처럼 보이지만 Axios에서 요청이 실패하면 오류 데이터를 얻으려고합니다.

axios.get('foo.com')
    .then((response) => {})
    .catch((error) => {
        console.log(error) //Logs a string: Error: Request failed with status code 404
    })

문자열 대신 상태 코드와 내용이있는 객체를 얻을 수 있습니까? 예를 들면 다음과 같습니다.

Object = {status: 404, reason: 'Not found', body: '404 Not found'}



답변

당신이 보는 것은 객체 의 toString메소드에 의해 반환되는 문자열 error입니다. ( error문자열이 아닙니다.)

서버로부터 응답을 받으면 error객체에 다음 response속성 이 포함 됩니다.

axios.get('/foo')
  .catch(function (error) {
    if (error.response) {
      console.log(error.response.data);
      console.log(error.response.status);
      console.log(error.response.headers);
    }
  });


답변

@Nick이 말했듯 console.log이 JavaScript Error객체를 사용할 때 표시되는 결과 는의 정확한 구현에 console.log따라 다르며 (imo) 오류를 확인하는 것은 매우 성가신 일입니다.

전체 Error객체와 toString()메소드를 우회하는 모든 정보 를 보려면 JSON.stringify 만 사용할 수 있습니다 .

axios.get('/foo')
  .catch(function (error) {
    console.log(JSON.stringify(error))
  });


답변

이 인터셉터를 사용하여 오류 응답을 얻습니다.

const HttpClient = axios.create({
  baseURL: env.baseUrl,
});

HttpClient.interceptors.response.use((response) => {
  return response;
}, (error) => {
  return Promise.resolve({ error });
});


답변

TypeScript를 사용하면 올바른 유형으로 원하는 것을 쉽게 찾을 수 있습니다.

import { AxiosResponse, AxiosError } from 'axios'

axios.get('foo.com')
  .then(response: AxiosResponse => {
    // Handle response
  })
  .catch((reason: AxiosError) => {
    if (reason.response!.status === 400) {
      // Handle 400
    } else {
      // Handle else
    }
    console.log(reason.message)
  })


답변

스프레드 연산자 ( ...)를 사용하여 다음과 같이 새 객체로 만들 수 있습니다.

axios.get('foo.com')
    .then((response) => {})
    .catch((error) => {
        console.log({...error})
})

주의 : 이것은 오류의 인스턴스가 아닙니다.


답변

이것은 알려진 버그입니다. "axios": "0.13.1"

https://github.com/mzabriskie/axios/issues/378

나는 같은 문제가있어서을 사용했다 "axios": "0.12.0". 그것은 나를 위해 잘 작동합니다.


답변

validateStatusrequest config에 새로운 옵션이 있습니다 . status <100 또는 status> 300 (기본 동작) 인 경우 예외를 발생시키지 않도록 지정할 수 있습니다. 예:

const {status} = axios.get('foo.com', {validateStatus: () => true})