Come posso ottenere il codice di stato da un errore http in Axios?


204

Questo può sembrare stupido, ma sto cercando di ottenere i dati di errore quando una richiesta fallisce in Axios.

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

Invece della stringa, è possibile ottenere un oggetto con forse il codice di stato e il contenuto? Per esempio:

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

Risposte:


371

Quello che vedi è la stringa restituita dal toStringmetodo errordell'oggetto. ( errornon è una stringa.)

Se è stata ricevuta una risposta dal server, l' erroroggetto conterrà la responseproprietà:

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
Puoi spiegarmi la magia che si sta trasformando automaticamente in una stringa se non mi riferisco alla responseproprietà?
Sebastian Olsen,

7
console.logutilizza il toStringmetodo per formattare gli Erroroggetti. Non ha nulla a che fare con il riferimento alla responseproprietà.
Nick Uraltsev,

3
Sono ancora confuso, è specifico per gli oggetti di errore o? Se consolo.log un oggetto, ottengo l'oggetto, non una stringa.
Sebastian Olsen,

3
Dipende dall'implementazione. Ad esempio, l'implementazione node.js degli oggetti console.log handle Error come caso speciale. Non posso dire come sia esattamente implementato nei browser, ma se chiami console.log({ foo: 'bar' });e console.log(new Error('foo'));nella console DevTools di Chrome, vedrai che i risultati sembrano diversi.
Nick Uraltsev,

5
Allora deve essere una cosa nativa. È comunque strano.
Sebastian Olsen,

17

Come ha detto @Nick, i risultati che vedi quando sei console.logun Erroroggetto JavaScript dipendono dall'esatta implementazione console.log, che varia e (imo) rende il controllo degli errori incredibilmente fastidioso.

Se desideri vedere l' Erroroggetto completo e tutte le informazioni che trasporta bypassando il toString()metodo, puoi semplicemente usare JSON.stringify :

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

8

Sto usando questi intercettori per ottenere la risposta all'errore.

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

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

6

Con TypeScript, è facile trovare quello che vuoi con il tipo giusto.

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

Puoi usare l'operatore spread ( ...) per forzarlo in un nuovo oggetto come questo:

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

Attenzione: questa non sarà un'istanza di errore.



1

C'è una nuova opzione chiamata validateStatusnella configurazione della richiesta. Puoi usarlo per specificare di non generare eccezioni se status <100 o status> 300 (comportamento predefinito). Esempio:

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

0

È possibile inserire l'errore in un oggetto e registrare l'oggetto, in questo modo:

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

Spero che questo aiuti qualcuno là fuori.


0

Per ottenere il codice di stato http restituito dal server, è possibile aggiungere validateStatus: status => truealle opzioni axios:

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

In questo modo, ogni risposta http risolve la promessa restituita da Axios.

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


0

È il mio codice: lavora per me

 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")
    })
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.