javascript fetch - 'प्रतिक्रिया' पर 'json' निष्पादित करने में विफल: बॉडी स्ट्रीम लॉक है


106

जब अनुरोध की स्थिति 400 से अधिक हो जाती है (मैंने 400, 423, 429 राज्यों की कोशिश की है), लौटे हुए जसन सामग्री को नहीं पढ़ सकता है। ब्राउज़र कंसोल में निम्न त्रुटि प्रदर्शित होती है

अनकैप्ड (वादे में) टाइपरोर: 'रिस्पांस' पर 'जन्स' निष्पादित करने में विफल: बॉडी स्ट्रीम लॉक हो गई है

मैंने निम्न प्रतिक्रिया ऑब्जेक्ट की सामग्री निम्नानुसार दिखाई:

यहां छवि विवरण दर्ज करें

लेकिन मैं अभी भी कुछ महीने पहले इसका इस्तेमाल कर सकता हूं।

मेरा प्रश्न इस प्रकार है:

  • क्या यह क्रोम ब्राउज़र का व्यवहार है या मानक परिवर्तन है?
  • क्या इन राज्यों की शरीर सामग्री प्राप्त करने का कोई तरीका है?

पुनश्च: मेरा ब्राउज़र संस्करण Google Chrome 70.0.3538.102 正式 版 )本) 位 64 is is है


इसका मतलब है कि आपको एपी से प्रतिक्रिया मिल रही है, लेकिन इसकी वैधता नहीं है, क्या आप अनुरोध में सभी आवश्यक पैरामीटर भेज रहे हैं?
किरनवज

@kiranvj मैंने अपना डेटा, एक ही सामग्री सत्यापित की, मैंने इसे सही ढंग से प्राप्त करने के लिए केवल स्थिति कोड को 200 में बदल दिया।
लूना

1
मुझे एक ही समस्या है लेकिन मेरी स्थिति 200 है, आपने इसे आखिर हल कैसे किया?
दावसेव

@DavSev एक विशिष्ट स्थिति कोड के लिए, मुझे axios के माध्यम से रिटर्न डेटा मिलता है
लूना

1
यह 200 के साथ भी होता है।
schlingel

जवाबों:


173

मैं इस त्रुटि से भी मिला, लेकिन पता चला कि यह रिस्पांस की स्थिति से संबंधित नहीं है, असली समस्या यह है कि आप केवल Response.json()एक बार उपभोग कर सकते हैं , यदि आप एक से अधिक बार इसका उपभोग कर रहे हैं, तो त्रुटि होगी।

नीचे की तरह:

    fetch('http://localhost:3000/movies').then(response =>{
    console.log(response);
    if(response.ok){
         console.log(response.json()); //first consume it in console.log
        return response.json(); //then consume it again, the error happens

    }

तो समाधान यह है कि ब्लॉक Response.json()में एक से अधिक बार खपत से बचें then


4
आप इसका response.clone()सेवन करने से पहले कर सकते हैं ।
बाल्डुरन

अच्छा लगा। मैं console.log(r.json()); return r.json();जो इसे तोड़ दिया था।
mewc

2
धन्यवाद यह मेरे लिए काम किया ..... कोई भी इस अजीब व्यवहार की व्याख्या कर सकता है?
सचिन

72

Response.clone()क्लोन करने के लिए उपयोग करेंResponse

उदाहरण

fetch('yourfile.json').then(res=>res.clone().json())

18
यह मेरे लिए बहुत अच्छा काम हुआ, लेकिन किसी को भी समझ में आया कि यह क्यों जरूरी है? मैंने इसे देखा, और मैं देखता हूं कि कभी-कभी एक पाठक पढ़ना शुरू कर देता है Response.body, यह उस पाठक के लिए बंद हो जाता है। लेकिन मैं जो देख सकता हूं (कम से कम मेरे कोड में), कुछ भी कभी भी पढ़ना शुरू नहीं हुआ है ... क्या कोई व्याख्या है कि पठनीय धारा कैसे स्वचालित रूप से लॉक हो सकती है?
25:19

5
मेरे पास एक ही मुद्दा था लेकिन मुझे पता चला कि क्रोम डिवाइसेस में मेरे वॉच पैनल में "res.json ()" था, जो कोड से पहले ही हल हो रहा था!
फेलिपड्रॉन्ड

1
रुको क्या? @FelipeDrumond एक पागल (गैर) बग thats!
जॉर्ज माउर

@GeorgeMauer ठीक है, अगर हम केवल प्रतिक्रिया चला सकते हैं। Json () एक बार और आपके क्रोम देव उपकरण वॉच पैनल चलता है कि आपके कोड से पहले, आपके पास एक अपवाद होगा क्योंकि ठीक है, आपने प्रतिक्रिया की शुरुआत की। json () दो बार!
फेलिपड्रैमंड

संदर्भ MDN
foxiris

7

प्रतिक्रिया मेथोड जैसे 'जोंस', 'टेक्स्ट' को एक बार बुलाया जा सकता है, और फिर इसे लॉक कर दिया जाता है। प्रतिक्रिया की पोस्ट की गई छवि दिखाती है कि शरीर लॉक है। इसका मतलब है कि आप पहले ही 'तब', 'कैच' कह चुके हैं। इसे फिर से शुरू करने के लिए आप निम्नलिखित प्रयास कर सकते हैं।

fetch(url)
    .then(response=> response.body.json())
    .then(myJson=> console.log(myJson))

या

fetch(url)
    .catch(response=> response.body.json())
    .catch(myJson=> console.log(myJson))

3

मुझे पता है कि बहुत देर हो चुकी है लेकिन यह किसी की मदद कर सकता है:

let response = await fetch(targetUrl);
let data = await response.json();

2

मैं भी इसमें फंस गया। लेकिन यह मेरे लिए काम कर गया।

fetch(YOUR_URL)
.then(res => {
  try {
    if (res.ok) {
      return res.json()
    } else {
      throw new Error(res)
    }
  }
  catch (err) {
    console.log(err.message)
    return WHATEVER_YOU_WANT_TO_RETURN
  }
})
.then (resJson => {
  return resJson.data
})
.catch(err => console.log(err))

सौभाग्य


एक उदाहरण के बारे में MDN में लाने github.com/mdn/fetch-examples/blob/master/fetch-json/...
Magaesh

1

मैं गलती से एक प्रतिक्रिया वस्तु का पुन: उपयोग कर रहा था, कुछ इस तरह:

const response = await new ReleasePresetStore().findAll();
const json = await response.json();
this.setState({ releasePresets: json });

const response2 = await new ReleasePresetStore().findActive();
const json2 = await response.json();
this.setState({ active: json2 });
console.log(json2);

यह रेखा:

const json2 = await response.json();

किया जाना चाहिए (प्रतिक्रिया 2 के बजाय इस्तेमाल किया response1):

const json2 = await response2.json();

पिछली प्रतिक्रिया का पुन: उपयोग करने से कोई मतलब नहीं था और यह एक गंदा कोड टाइपो था ...



0

जैसा कि प्रश्न में उल्लेख किया गया है कि जब आप एक ही प्रतिक्रिया वस्तु का उपयोग करने का प्रयास कर रहे हैं, तो आपका शरीर वस्तु की स्थिति के कारण लॉक होने वाला है। आप क्या कर सकते हैं कि प्रतिक्रिया ऑब्जेक्ट के मूल्य को कैप्चर करें और फिर उस पर (.then ()) कुछ ऑपरेशन करने का प्रयास करें। कृपया नीचे दिए गए कोड का पालन करें,

fetch('someurl').then(respose) => {
    let somedata = response.json(); // as you will capture the json response, body will not be locked anymore. 
    somedata.then(data) => {
        {
             error handling (if (data.err) { ---- })
        }
        {
             operations (else { ---- })
        }
    } 
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.