Axios'daki bir http hatasından durum kodunu nasıl alabilirim?


204

Bu aptalca görünebilir, ancak Axios'ta bir istek başarısız olduğunda hata verilerini almaya çalışıyorum.

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

Dize yerine, belki durum kodu ve içeriğe sahip bir nesne elde etmek mümkün müdür? Örneğin:

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

Yanıtlar:


371

Gördüğünüz şey toString, errornesnenin yöntemi tarafından döndürülen dizedir . ( errorbir dize değildir.)

Sunucudan bir yanıt alındıysa, errornesne şu responseözelliği içerecektir :

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
Özelliğe başvurmazsam arkasındaki büyüyü otomatik olarak bir dizeye dönüştürebilir responsemisin?
Sebastian Olsen

7
console.lognesneleri toStringbiçimlendirmek için yöntemi kullanır Error. responseMülke atıfta bulunmakla ilgisi yoktur .
Nick Uraltsev

2
Hala kafam karıştı, bu hata nesnelerine mi özgü? Bir nesneyi console.log yaparsam, nesneyi alırım, bir dize değil.
Sebastian Olsen

3
Bu uygulamaya bağlıdır. Örneğin, node.js uygulaması nesneleri özel bir durum olarak console.log işler Error . Tarayıcılarda tam olarak nasıl uygulandığını söyleyemem, ancak Chrome DevTools Konsolunu arar console.log({ foo: 'bar' });ve console.log(new Error('foo'));sonuçların farklı göründüğünü görürsünüz.
Nick Uraltsev

5
O zaman yerli bir şey olmalı. Yine de garip.
Sebastian Olsen

17

@Nick'in dediği gibi, console.logbir JavaScript Errornesnesi uyguladığınızda gördüğünüz sonuçlar , tam olarak uygulanmasına bağlıdır console.log, bu da değişir ve (imo) hataları kontrol etmeyi inanılmaz derecede can sıkıcı hale getirir.

Yöntemi Erroratlayarak nesnenin tamamını ve taşıdığı tüm bilgileri görmek toString()istiyorsanız, JSON.stringify komutunu kullanabilirsiniz :

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

8

Hata yanıtını almak için bu önleyicileri kullanıyorum.

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

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

6

TypeScript ile, doğru türde istediğinizi bulmak kolaydır.

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

Forma operatörünü ( ...) kullanarak yeni bir nesneye zorlayabilirsiniz:

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

Dikkat: Bu bir Hata örneği olmayacaktır.



1

validateStatusİstek yapılandırmasında yeni bir seçenek var . Durum <100 veya durum> 300 (varsayılan davranış) durumunda istisna atmamayı belirtmek için kullanabilirsiniz. Misal:

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

0

Hatayı bir nesneye koyabilir ve nesneyi aşağıdaki gibi günlüğe kaydedebilirsiniz:

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

Umarım bu birisine yardım eder.


0

Http durum kodunu sunucudan validateStatus: status => truedöndürmek için axios seçeneklerine ekleyebilirsiniz :

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

Bu şekilde her http yanıtı, aksiyoslardan döndürülen sözü çözer.

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


0

Benim kodum: Benim için çalış

 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")
    })
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.