2016-11-02 5 views
23

मुझे रीडबलस्ट्रीम ऑब्जेक्ट से जानकारी कैसे प्राप्त हो सकती है?एक पढ़ने योग्य स्ट्रीम ऑब्जेक्ट से डेटा पुनर्प्राप्त करें?

मैं Fetch API का उपयोग कर रहा हूं और मुझे यह दस्तावेज़ीकरण से स्पष्ट नहीं दिख रहा है।

शरीर को एक पठनीय स्ट्रीम के रूप में वापस किया जा रहा है और मैं बस इस धारा के भीतर एक संपत्ति का उपयोग करना चाहता हूं। ब्राउज़र देव उपकरण में प्रतिक्रिया के तहत, मुझे लगता है कि जावास्क्रिप्ट ऑब्जेक्ट के रूप में, यह जानकारी गुणों में व्यवस्थित है।

fetch('http://192.168.5.6:2000/api/car', obj) 
    .then((res) => { 
     if(res.status == 200) { 
      console.log("Success :" + res.statusText); //works just fine 
     } 
     else if(res.status == 400) { 
      console.log(JSON.stringify(res.body.json()); //res.body is undefined. 
     } 

     return res.json(); 
    }) 

अग्रिम धन्यवाद।

+1

[बॉडी एपीआई संदर्भ] (https://developer.mozilla.org/en-US/docs/Web/API/Body) –

+0

@ फ्रांसेस्कोपेज़ेला प्रतिक्रिया के लिए धन्यवाद। मैंने 'प्रतिक्रिया.बॉडी.जेसन()' की कोशिश की है, लेकिन मुझे _italic_ टाइपर मिल रहा है: अपरिभाषित _italic_ की संपत्ति 'json' नहीं पढ़ सकता। क्या ऐसा इसलिए है क्योंकि bodyUsed संपत्ति भी झूठी पर सेट है? हालांकि मैं ब्राउज़र डेवलपर टूल में प्रतिक्रिया टैब के तहत इस शरीर को देख सकता हूं। एक त्रुटि संदेश है जिसे मैं पुनर्प्राप्त करना चाहता हूं। – noob

+0

तो आपकी समस्या पूरी तरह से त्रुटि 400 स्थिति से संबंधित है? यदि आप हैंडलर को 'console.log (res.json()) में बदलते हैं तो क्या होता है; '? क्या आप डेटा देख रहे हैं? –

उत्तर

35

ReadableStream से डेटा तक पहुंचने के लिए आपको रूपांतरण विधियों में से एक को कॉल करने की आवश्यकता है (दस्तावेज़ here उपलब्ध हैं)।

एक उदाहरण के रूप:

fetch('https://jsonplaceholder.typicode.com/posts/1') 
    .then(function(response) { 
    // The response is a Response instance. 
    // You parse the data into a useable format using `.json()` 
    return response.json(); 
    }).then(function(data) { 
    // `data` is the parsed version of the JSON returned from the above endpoint. 
    console.log(data); // { "userId": 1, "id": 1, "title": "...", "body": "..." } 
    }); 

आशा यह स्पष्ट चीजों को मदद मिलती है।

+0

प्रतिक्रिया के लिए धन्यवाद। मैंने यह कोशिश की है और अभी भी वही त्रुटि मिल रही है जहां res.body अनिर्धारित है। मैं स्थिति को फिर से प्राप्त करने में सक्षम हूं हालांकि पहले() res.status के साथ फ़ंक्शन। ऐसा लगता है कि केवल शरीर एक पठनीयस्ट्रीम वस्तु है। ऐसा प्रतीत होता है कि एक संपत्ति लॉक है, जो सत्य पर सेट है? – noob

+0

आप 'res.body' तक पहुंचने का प्रयास कर रहे हैं (यह मेरे उदाहरण का हिस्सा नहीं है)? क्या आप अपने मूल प्रश्न में कुछ नमूना कोड साझा कर सकते हैं ताकि यह स्पष्ट हो सके कि आपकी समस्या कहां हो सकती है। –

+0

मैंने जेसन प्रतिक्रिया से res.body को एक्सेस करने का प्रयास किया जो पहले में वापस लौटाया गया था .then() फ़ंक्शन। मैंने अधिक स्पष्टता के लिए अपने मूल प्रश्न में एक नमूना जोड़ा है। धन्यवाद! – noob

9

res.json() एक वादा देता है। प्रयास करें ...

res.json().then(body => console.log(body)); 
+1

मैंने कोशिश की, और यह शरीर के बजाय वादा मुद्रित किया। – reectrix

10

कुछ लोगों को एक async उदाहरण उपयोगी हो सकते हैं:

var response = await fetch("https://httpbin.org/ip"); 
var body = await response.json(); // .json() is asynchronous and therefore must be awaited 

json() एक json वस्तु के लिए एक ReadableStream से प्रतिक्रिया के शरीर बदल देता है।

await बयान हालांकि आप (संस्करण 62) के रूप में क्रोम के कंसोल में सीधे await बयान चला सकते हैं, एक async समारोह में लिपटे किया जाना चाहिए।

+4

कंसोल प्रॉम्प्ट पर प्रयोग करने के लिए बढ़िया है। कम टाइपिंग – Amitabh

संबंधित मुद्दे