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


204

이것은 어리석은 것처럼 보이지만 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'}

답변:


371

당신이 보는 것은 객체 의 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);
    }
  });

9
response속성을 참조하지 않으면 뒤에 숨겨진 마법이 자동으로 문자열로 바뀌는 것을 설명 할 수 있습니까 ?
Sebastian Olsen

7
console.logtoString방법을 사용하여 Error객체 를 포맷 합니다. response속성 을 언급하는 것과는 아무런 관련이 없습니다 .
Nick Uraltsev

2
여전히 혼란 스럽습니다. 오류 개체에 적합합니까? 객체를 console.log하면 문자열이 아닌 객체를 얻습니다.
Sebastian Olsen

3
구현에 따라 다릅니다. 예를 들어 node.js 구현은 특별한 경우로 객체를 console.log 처리 Error 합니다. 나는 그것이 브라우저에서 구현 어떻게 정확히 말할 수 없다,하지만 당신은 호출하는 경우 console.log({ foo: 'bar' });console.log(new Error('foo'));크롬 DevTools로 콘솔에서, 당신은 결과가 다를 것을 볼 수 있습니다.
Nick Uraltsev

5
그렇다면 기본이어야합니다. 그래도 여전히 이상합니다.
Sebastian Olsen

17

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

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

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

8

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

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

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

6

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

2

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

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

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



1

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

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

0

오류를 객체에 넣고 다음과 같이 객체를 기록 할 수 있습니다.

axios.get('foo.com')
    .then((response) => {})
    .catch((error) => {
        console.log({error}) // this will log an empty object with an error property
    });

이것이 누군가를 도울 수 있기를 바랍니다.


0

서버에서 http 상태 코드를 리턴 validateStatus: status => true하기 위해 axios 옵션에 추가 할 수 있습니다.

axios({
    method: 'POST',
    url: 'http://localhost:3001/users/login',
    data: { username, password },
    validateStatus: () => true
}).then(res => {
    console.log(res.status);
});

이런 식으로 모든 http 응답은 axios에서 리턴 된 약속을 해결합니다.

https://github.com/axios/axios#handling-errors


0

내 코드입니다 : 나를 위해 일하십시오

 var jsonData = request.body;
    var jsonParsed = JSON.parse(JSON.stringify(jsonData));

    // message_body = {
    //   "phone": "5511995001920",
    //   "body": "WhatsApp API on chat-api.com works good"
    // }

    axios.post(whatsapp_url, jsonParsed,validateStatus = true)
    .then((res) => {
      // console.log(`statusCode: ${res.statusCode}`)

            console.log(res.data)
        console.log(res.status);

        // var jsonData = res.body;
        // var jsonParsed = JSON.parse(JSON.stringify(jsonData));

        response.json("ok")
    })
    .catch((error) => {
      console.error(error)
        response.json("error")
    })
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.