मैं Axios में http त्रुटि से स्थिति कोड कैसे प्राप्त कर सकता हूं?


202

यह बेवकूफ लग सकता है, लेकिन मैं त्रुटि डेटा प्राप्त करने की कोशिश कर रहा हूं जब एक्सियोस में एक अनुरोध विफल हो जाता है।

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

जवाबों:


366

आप जो देख 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संपत्ति का उल्लेख नहीं करता हूं तो क्या आप इसके पीछे के जादू को स्वचालित रूप से एक स्ट्रिंग में बदल सकते हैं?
सेबस्टियन ऑलसेन

7
console.logवस्तुओं toStringको प्रारूपित करने की विधि का उपयोग करता है Errorresponseसंपत्ति का जिक्र करने से इसका कोई लेना-देना नहीं है ।
निक यूराल्टसेव

2
मैं अभी भी उलझन में हूं, क्या यह त्रुटि वाली वस्तुओं के लिए खतरनाक है या? यदि मैं किसी ऑब्जेक्ट को कंसोल करता हूं, तो मुझे ऑब्जेक्ट मिलता है, न कि स्ट्रिंग।
सेबस्टियन ऑलसेन

3
यह कार्यान्वयन पर निर्भर करता है। उदाहरण के लिए, नोड.जेएस एक विशेष मामले के रूप में वस्तुओं के कार्यान्वयन को लागू console.log करता है Error । मैं यह नहीं कह सकता कि यह वास्तव में ब्राउज़रों में कैसे लागू होता है, लेकिन यदि आप कॉल करते हैं console.log({ foo: 'bar' });और console.log(new Error('foo'));क्रोम DevTools कंसोल में, आप देखेंगे कि परिणाम अलग दिखते हैं।
निक यूराल्त्सेव

5
तब एक देशी चीज़ होनी चाहिए। हालांकि यह अभी भी अजीब है।
सेबस्टियन ऑलसेन

17

जैसा कि @Nick ने कहा, जब आप console.logएक जावास्क्रिप्ट Errorऑब्जेक्ट के कार्यान्वयन पर निर्भर करते हैं, तो आप जो परिणाम देखते हैं, वह console.logभिन्न होता है और (imo) त्रुटियों की जाँच करता है जो अविश्वसनीय रूप से कष्टप्रद है।

यदि आप विधि Errorको दरकिनार करते हुए पूरी वस्तु और सभी जानकारी देखना चाहते हैं toString(), तो आप सिर्फ JSON.stringing का उपयोग कर सकते हैं :

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

टाइपस्क्रिप्ट के साथ, यह खोजना आसान है कि आप सही प्रकार के साथ क्या चाहते हैं।

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

यह एक ज्ञात बग है, उपयोग करने का प्रयास करें "axios": "0.13.1"

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

मैं एक ही समस्या थी तो मैं का उपयोग कर समाप्त हो गया "axios": "0.12.0"। यह मेरे लिए ठीक काम करता है।


1
यह वही मुद्दा नहीं है जो मैं कर रहा हूं, जब मैं लॉग इन करता हूं तो इसमें कोई ऑब्जेक्ट शामिल नहीं होता हैerror
सेबस्टियन ऑलसेन

1

एक नया विकल्प है जिसे validateStatusअनुरोध कॉन्फिग में कहा जाता है। यदि स्थिति <100 या स्थिति> 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 => trueaxios विकल्पों में जोड़ सकते हैं :

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

इस तरह, हर http प्रतिक्रिया अक्षीयता से दिए गए वादे को हल करती है।

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")
    })
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.