জাভাস্ক্রিপ্ট আনয়ন - 'রেসপন্স'-এ' জসন 'চালানোতে ব্যর্থ: বডি স্ট্রিমটি লক করা আছে


112

যখন অনুরোধের অবস্থা 400 এর চেয়ে বেশি হয় (আমি 400, 423, 429 টি রাষ্ট্র চেষ্টা করেছি), আনতে ফিরে আসা জসন সামগ্রীটি পড়তে পারে না। নিম্নলিখিত ত্রুটিটি ব্রাউজার কনসোলে প্রদর্শিত হয়

অপ্রকাশিত (প্রতিশ্রুতি) প্রকারের ত্রুটি: 'প্রতিক্রিয়া' তে 'জসন' চালানোতে ব্যর্থ: দেহের স্ট্রিমটি লক করা আছে

আমি প্রত্যাবর্তিত প্রতিক্রিয়া অবজেক্টের বিষয়বস্তু নীচে দেখিয়েছি:

এখানে চিত্র বর্ণনা লিখুন

তবে আমি এটি কয়েক মাস আগেও ব্যবহার করতে পারি।

আমার প্রশ্নটি নিম্নরূপ:

  • এটি কি কেবল ক্রোম ব্রাউজারের আচরণ বা আনার মান পরিবর্তন?
  • এই রাজ্যের দেহের সামগ্রী পাওয়ার কোনও উপায় আছে কি?

PS: আমার ব্রাউজার সংস্করণটি হ'ল গুগল ক্রোম 70.0.3538.102 (正式 版本) (64 位)


এর অর্থ আপনি এপিআইয়ের কাছ থেকে প্রতিক্রিয়া পাচ্ছেন, তবে এটি কোনও বৈধ জাসন নয়, আপনি কি অনুরোধে সমস্ত প্রয়োজনীয় পরামিতি প্রেরণ করছেন?
কিরণভিজ

@kiranvj আমি আমার ডেটা, একই বিষয়বস্তু যাচাই করেছি, আমি সঠিকভাবে এটির জন্য স্ট্যাটাস কোডটি 200 এ পরিবর্তন করেছি।
লুনা

4
আমার একই সমস্যা আছে তবে আমার স্ট্যাটাস 200, অবশেষে আপনি কীভাবে সমাধান করেছেন?
ডেভসेव

@ ডেভসিয়েভ একটি নির্দিষ্ট স্থিতির কোডের জন্য, আমি অক্ষের মাধ্যমে রিটার্নের ডেটা পাই
লুনা

4
এটি ২০০ এর সাথেও ঘটে।
স্ক্লিংগেল

উত্তর:


182

আমি এই ত্রুটিটিও পূরণ করেছিলাম তবে এটি জানতে পেরেছি যে এটি প্রতিক্রিয়া রাজ্যের সাথে সম্পর্কিত নয়, আসল সমস্যাটি হ'ল আপনি কেবল 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


6
আপনি response.clone()এটি গ্রহণ করার আগে পারে।
বালদুড়ান

ভাল লাগল আমার একটা ছিল console.log(r.json()); return r.json();যা ভেঙে গেল
mewc

4
ধন্যবাদ এটি আমার পক্ষে কাজ করেছে ..... কেউ কি এই অদ্ভুত আচরণটি ব্যাখ্যা করতে পারে?
শচীন

ধন্যবাদ, মানুষ এটি আমার জন্য নিখুঁতভাবে কাজ করেছে
রনি পেরেজ

75

Response.clone()ক্লোন করতে ব্যবহার করুনResponse

উদাহরণ

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

19
এটি আমার পক্ষে দুর্দান্ত কাজ করেছে, তবে যে কেউ কেন এটি প্রয়োজনীয় তা বুঝতে পারে? আমি এটি সন্ধান করেছি এবং আমি দেখতে পাচ্ছি যে কখনও কখনও পাঠক একবার পড়া শুরু করলে Response.body, এটি সেই পাঠকের কাছে তালাবন্ধ হয়ে যায়। তবে আমি যা দেখতে পাচ্ছি (কমপক্ষে আমার কোডে) কিছুই পড়তে শুরু করেনি ... পাঠযোগ্য স্ট্রিমটি কীভাবে স্বয়ংক্রিয়ভাবে লক হয়ে যায় তার কোনও ব্যাখ্যা আছে?
jenming

6
আমার একই সমস্যা ছিল তবে আমি জানতে পেরেছিলাম যে ক্রোম দেব সরঞ্জামগুলিতে আমার ওয়াচ প্যানেলে "res.json ()" ছিল, যা কোডের আগেই সমাধান করা হয়েছিল!
ফিলিপড্রামন্ড

4
কিসের অপেক্ষা? @ ফিলিপ ড্রামন্ড একটি ক্রেজি (নন) বাগ চালিয়েছে!
জর্জ মাউয়ার

@ জর্জিমৌর ওয়েল, যদি আমরা কেবল একবার রেসপন্স.জসন () চালাতে পারি এবং আপনার ক্রোম ডিভাইস ওয়াচ প্যানেলটি আপনার কোডের আগে চালিত হয় তবে আপনার একটি ব্যতিক্রম হবে কারণ ভাল, আপনি দুটিবার রেসপন্স.জসন () দৌড়েছিলেন!
ফিলিপড্রামন্ড

রেফারেন্স MDN
ফক্সিরিস

8

'জসন', 'পাঠ্য' এর মতো প্রতিক্রিয়া মেথোডে একবার কল করা যেতে পারে এবং তারপরে এটি লক হয়ে যায়। প্রতিক্রিয়া পোস্ট করা ছবিতে দেখায় যে শরীর লক হয়েছে। এর অর্থ আপনি ইতিমধ্যে 'তারপর', 'ধরা' কল করেছেন। এটি পুনরায় চালু করতে আপনি নিম্নলিখিত চেষ্টা করতে পারেন।

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

বা

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

4

আমি জানি এটি অনেক দেরি হয়ে গেছে তবে এটি কাউকে সহায়তা করতে পারে:

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

অসম্পূর্ণ / প্রতীক সিনট্যাক্স ব্যবহার করে এই বিষয়টি সমাধান করার জন্য আমার ঠিক কী দরকার ছিল, ধন্যবাদ!
ttemple

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

শুভকামনা



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();

হওয়া উচিত ছিল (ব্যবহৃত প্রতিক্রিয়া 1 এর পরিবর্তে প্রতিক্রিয়া 2):

const json2 = await response2.json();

পূর্ববর্তী প্রতিক্রিয়া পুনরায় ব্যবহার করা কোনও অর্থহীন নয় এবং এটি একটি নোংরা কোড টাইপ ছিল ...



0

প্রশ্নে উল্লিখিত হিসাবে আপনি যখন একই প্রতিক্রিয়া অবজেক্টটি ব্যবহার করার চেষ্টা করছেন, তখন আপনার শরীরটি অবজেক্টের অবস্থার কারণে লক করতে চলেছে। আপনি যা করতে পারেন তা হ'ল প্রতিক্রিয়ার অবজেক্টের মান ক্যাপচার করুন এবং তারপরে কিছু অপারেশন করার চেষ্টা করুন (.থেন ())। নীচের কোডটি অনুসরণ করুন,

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 { ---- })
        }
    } 
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.