505 votes

Comment puis-je obtenir le code d'état d'une erreur http dans Axios ?

Cela peut sembler stupide, mais j'essaie d'obtenir les données d'erreur lorsqu'une requête échoue dans Axios.

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

Au lieu de la chaîne de caractères, est-il possible d'obtenir un objet contenant peut-être le code d'état et le contenu ? Par exemple :

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

966voto

Nick Uraltsev Points 4551

Ce que vous voyez est la chaîne de caractères renvoyée par la fonction toString de la méthode error objet. ( error n'est pas une chaîne de caractères).

Si une réponse a été reçue du serveur, l'option error contiendra l'objet response propriété :

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

27 votes

Pouvez-vous expliquer la magie qui fait qu'il se transforme automatiquement en une chaîne de caractères si je ne me réfère pas à l'objet de l'accord. response la propriété ?

25 votes

console.log utilise le toString pour mettre en forme Error des objets. Cela n'a rien à voir avec la référence à l response propriété.

8 votes

Je ne comprends toujours pas. Est-ce que c'est spécifique aux objets d'erreur ou ? Si je console.log un objet, j'obtiens l'objet, pas une chaîne.

56voto

Yan QiDong Points 111

Avec TypeScript, il est facile de trouver ce que vous voulez avec le bon type.

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

24voto

danii Points 3884

Comme l'a dit @Nick, les résultats que vous obtenez lorsque vous console.log un JavaScript Error dépend de l'implémentation exacte de l'objet console.log qui varie et (imo) rend la vérification des erreurs incroyablement ennuyeuse.

Si vous souhaitez voir l'intégralité Error et toutes les informations qu'il transporte en contournant le toString() vous pouvez simplement utiliser la méthode JSON.stringify :

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

18voto

Dmytro Naumenko Points 61

Il existe une nouvelle option appelée validateStatus dans la configuration des demandes. Vous pouvez l'utiliser pour spécifier de ne pas lancer d'exceptions si le statut < 100 ou le statut > 300 (comportement par défaut). Exemple :

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

12voto

Moishey Schwartz Points 311

Vous pouvez utiliser l'opérateur d'étalement ( ... ) pour le forcer dans un nouvel objet comme ceci :

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

Attention : il ne s'agira pas d'une instance de Error.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X