Signatur
Beschreibung
Die Eigenschaft bodyUsed zeigt an, ob der Datenstrom (ReadableStream) einer Response bereits gelesen wurde. Der Body einer Antwort lässt sich nur einmal lesen: Sobald eine der Lesemethoden wie json(), text(), blob(), arrayBuffer() oder formData() aufgerufen wurde, wechselt bodyUsed auf true.
Sinnvoll ist die Eigenschaft vor allem in wiederverwendbarem Code, etwa in Hilfsfunktionen, Middlewares, Service Workern oder Fehlerbehandlungen, die eine Response übergeben bekommen und nicht wissen, ob der Body schon verarbeitet wurde. Statt einen TypeError zu riskieren, prüft man vorab bodyUsed und greift gegebenenfalls auf eine vorher mit clone() erzeugte Kopie zurück.
bodyUsed wird auch dann true, wenn man direkt über response.body.getReader() liest, sobald der Stream gesperrt bzw. gelesen wird. Eine Antwort ohne Body (z. B. new Response(null) oder eine 204-Antwort) hat bodyUsed === false, und das Lesen liefert einfach leere Daten.
Rückgabewert
true, wenn der Body bereits gelesen wurde, sonst false.Beispiele
Zustand vor und nach dem Lesen
const response = new Response(JSON.stringify({ ok: true }), {
headers: { 'Content-Type': 'application/json' }
});
console.log(response.bodyUsed);
const data = await response.json();
console.log(response.bodyUsed, data);
Doppeltes Lesen vermeiden
const readSafely = async (response) => {
if (response.bodyUsed) {
console.warn('Body wurde bereits gelesen.');
return null;
}
return response.text();
};
const res = await fetch('https://example.com/');
await res.text();
console.log(await readSafely(res));
Klonen, bevor der Body konsumiert wird (Service Worker)
self.addEventListener('fetch', (event) => {
event.respondWith((async () => {
const response = await fetch(event.request);
// Klonen, solange bodyUsed noch false ist
if (!response.bodyUsed && response.ok) {
const cache = await caches.open('v1');
await cache.put(event.request, response.clone());
}
return response;
})());
});
Lesen über den Stream-Reader
const response = new Response('Hallo Welt');
const reader = response.body.getReader();
const { value } = await reader.read();
console.log(new TextDecoder().decode(value));
console.log(response.bodyUsed);
// Wichtig · Fallstricke
- Ein zweiter Leseversuch bei
bodyUsed === trueführt zu einem abgelehnten Promise mitTypeError(z. B. „body stream already read“). clone()muss vor dem Lesen aufgerufen werden, beibodyUsed === truewirftclone()selbst einenTypeError.bodyUsedsagt nichts darüber aus, ob der Stream vollständig gelesen wurde, sondern nur, dass das Lesen begonnen hat bzw. der Stream verbraucht ist. Ein gesperrter Stream (response.body.locked) ist ebenfalls nicht mehr überjson()& Co. lesbar.- Die Eigenschaft ist schreibgeschützt; Zuweisungen werden ignoriert (im Strict Mode:
TypeError). - Gleiche Eigenschaft existiert auch auf
Request(über das gemeinsameBody-Mixin). Unterstützt in allen modernen Browsern sowie Node.js ab Version 18 (nativesfetch).