web-dev-qa-db-fra.com

extraction javascript - Impossible d'exécuter 'json' sur 'Response': le flux du corps est verrouillé

Lorsque l'état de la demande est supérieur à 400 (j'ai essayé 400, 423, 429 états), fetch ne peut pas lire le contenu JSON renvoyé. L'erreur suivante est affichée dans la console du navigateur.

Non capturé (promis) TypeError: Impossible d'exécuter 'json' sur 'Response': le flux de corps est verrouillé

J'ai montré le contenu de l'objet de réponse renvoyé comme suit:

 enter image description here

Mais je peux encore l'utiliser il y a quelques mois.

Ma question est la suivante:

  • S'agit-il simplement du comportement du navigateur Chrome ou des modifications standard d'extraction?
  • Existe-t-il un moyen d'obtenir le contenu du corps de ces états?

PS: la version de mon navigateur est Google Chrome 70.0.3538.102. Version 64 €.

4
Luna

Utilisez Response.clone() pour cloner Response

exemple

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

J'ai rencontré cette erreur aussi, mais j'ai découvert que cela n'était pas lié à l'état de Response. Le vrai problème est que vous ne pouvez consommer Response.json() qu'une seule fois. Si vous la consommez plus d'une fois, l'erreur se produira.

comme ci-dessous:

    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

    }
1
Wayne Wei

Une méthode de réponse telle que 'json', 'texte' peut être appelée une fois, puis elle se verrouille . L'image affichée de la réponse montre que le corps est verrouillé . Cela signifie que vous avez déjà appelé l'attribut 'then', 'catch '. Pour résoudre ce problème, vous pouvez essayer ce qui suit.

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

Ou

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