Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaScript fetch - Failed to execute 'json' on 'Response': body stream is locked

People also ask

How do I get JSON from fetch response?

To get JSON from the server using the Fetch API, you can use the response. json() method. The response. json() method reads the data returned by the server and returns a promise that resolves with a JSON object.

What is response JSON () in fetch?

json() The json() method of the Response interface takes a Response stream and reads it to completion. It returns a promise which resolves with the result of parsing the body text as JSON .


I met this error too but found out it is not related to the state of Response, the real problem is that you only can consume Response.json() once, if you are consuming it more than once, the error will happen.

like below:

    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

    }

So the solution is to avoid consuming Response.json() more than once in then block.


According to MDN, you should use Response.clone():

The clone() method of the Response interface creates a clone of a response object, identical in every way, but stored in a different variable. The main reason clone() exists is to allow multiple uses of Body objects (when they are one-use only.)

Example:

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

Response methode like 'json', 'text' can be called once, and then it locks. The posted image of response shows that body is locked. This means you have already called the 'then', 'catch'. To reslove this you can try the following.

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

Or

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

I know it's too late but it can help someone:

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

I was accidentally reusing a response object, something similar to this:

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

This line:

const json2 = await response.json();

Should have been (response2 instead of the used up response1):

const json2 = await response2.json();

Reusing the previous response made no sense and it was a dirty code typo...


I also stuck into this. But this worked for me.

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

good luck


This worked for me

response.json().then(data => {
  // use data
})