Wenn der Anforderungsstatus größer als 400 ist (ich habe 400, 423, 429 Zustände ausprobiert), kann Fetch den zurückgegebenen JSON-Inhalt nicht lesen. Der folgende Fehler wird in der Browserkonsole angezeigt
Nicht erfasst (im Versprechen) TypeError: Fehler beim Ausführen von 'json' bei 'Response': Der Body-Stream ist gesperrt
Ich habe den Inhalt des zurückgegebenen Antwortobjekts wie folgt angezeigt:
Aber ich kann es noch vor ein paar Monaten benutzen.
Meine Frage lautet wie folgt:
- Ist dies nur das Verhalten des Chrome-Browsers oder die Änderung des Abrufstandards?
- Gibt es eine Möglichkeit, den Körperinhalt dieser Zustände zu ermitteln?
PS: Meine Browserversion ist Google Chrome 70.0.3538.102 ((正式) (64 位)
javascript
fetch-api
Luna
quelle
quelle
Antworten:
Ich habe diesen Fehler auch festgestellt, aber festgestellt, dass er nicht mit dem Status der Antwort zusammenhängt. Das eigentliche Problem ist, dass Sie ihn nur
Response.json()
einmal konsumieren können. Wenn Sie ihn mehr als einmal konsumieren, tritt der Fehler auf.Wie unten:
Die Lösung besteht also darin, zu vermeiden,
Response.json()
mehr als einmal imthen
Block zu konsumieren .quelle
response.clone()
vor dem Verzehr.console.log(r.json()); return r.json();
die es kaputt machte.Verwenden Sie
Response.clone()
zum KlonResponse
Beispiel
quelle
Response.body
, für diesen Leser gesperrt wird. Aber nach allem, was ich sehen kann (zumindest in meinem Code), hat noch nie etwas mit dem Lesen begonnen ... gibt es eine Erklärung dafür, wie der lesbare Stream automatisch gesperrt werden könnte?Antwortmethode wie 'json', 'text' kann einmal aufgerufen werden und wird dann gesperrt. Das veröffentlichte Bild der Antwort zeigt, dass der Körper gesperrt ist. Dies bedeutet, dass Sie bereits das "Dann", "Fang" genannt haben. Um dies zu beheben, können Sie Folgendes versuchen.
Oder
quelle
Ich weiß, dass es zu spät ist, aber es kann jemandem helfen:
quelle
Ich habe mich auch daran gehalten. Aber das hat bei mir funktioniert.
Viel Glück
quelle
Ich habe versehentlich ein Antwortobjekt wiederverwendet, ähnlich wie dieses:
Diese Linie:
Sollte gewesen sein (Antwort2 anstelle der verbrauchten Antwort1):
Die Wiederverwendung der vorherigen Antwort ergab keinen Sinn und es war ein schmutziger Code-Tippfehler ...
quelle
Das hat bei mir funktioniert
quelle
Wie in der Frage erwähnt, wird Ihr Körper aufgrund des Status des Objekts gesperrt, wenn Sie versuchen, dasselbe Antwortobjekt zu verwenden. Sie können den Wert des Antwortobjekts erfassen und dann versuchen, eine Operation darauf auszuführen (.then ()). Bitte folgen Sie dem Code unten,
quelle