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 retourné. L'erreur suivante s'affiche dans la console du navigateur
Uncaught (in promise) TypeError: Impossible d'exécuter 'json' sur 'Response': le flux du corps est verrouillé
J'ai montré le contenu de l'objet de réponse retourné comme suit:
Mais je peux encore l'utiliser il y a quelques mois.
Ma question est la suivante:
- S'agit-il uniquement du comportement du navigateur Chrome ou des modifications apportées à la norme de récupération?
- Existe-t-il un moyen d'obtenir le contenu corporel de ces états?
PS: la version de mon navigateur est Google Chrome 70.0.3538.102 (正式 版本) (64 位)
javascript
fetch-api
Luna
la source
la source
Réponses:
J'ai rencontré cette erreur aussi mais j'ai découvert qu'elle n'est pas liée à l'état de réponse, 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:
La solution est donc d'éviter de consommer
Response.json()
plus d'une fois enthen
bloc.la source
response.clone()
avant de le consommer.console.log(r.json()); return r.json();
qui l'a cassé.Utilisation
Response.clone()
pour clonerResponse
exemple
la source
Response.body
, il est verrouillé sur ce lecteur. Mais d'après ce que je peux voir (du moins dans mon code), rien n'a jamais commencé à lire ... y a-t-il une explication sur la façon dont le flux lisible pourrait être automatiquement verrouillé?Une méthode de réponse comme «json», «text» peut être appelée une fois, puis elle se verrouille. L'image postée de la réponse montre que le corps est verrouillé. Cela signifie que vous avez déjà appelé le «alors», «attraper». Pour résoudre ce problème, vous pouvez essayer ce qui suit.
Ou
la source
Je sais qu'il est trop tard mais cela peut aider quelqu'un:
la source
Je suis également resté là-dedans. Mais cela a fonctionné pour moi.
bonne chance
la source
Je réutilisais accidentellement un objet de réponse, quelque chose de similaire à ceci:
Cette ligne:
Aurait dû être (response2 au lieu de la réponse épuisée1):
Réutiliser la réponse précédente n'avait aucun sens et c'était une faute de frappe de code sale ...
la source
Cela a fonctionné pour moi
la source
Comme mentionné dans la question, lorsque vous essayez d'utiliser le même objet de réponse, votre corps est sur le point de se verrouiller en raison de l'état de l'objet. Ce que vous pouvez faire, c'est capturer la valeur de l'objet de réponse, puis essayer d'effectuer une opération dessus (.then ()). Veuillez suivre le code ci-dessous,
la source