Start · Sprachen · JavaScript · Referenz · Response.bodyUsed

Response.bodyUsed

Eigenschaft

Schreibgeschützter boolescher Wert, der angibt, ob der Body einer <code>Response</code> bereits gelesen (konsumiert) wurde.

seit JavaScript Baseline: alle modernen Browser, Node.js 18+ Kategorie: webapi

Signatur

get Response.prototype.bodyUsed

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

Typ
boolean
Beschreibung
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);
false true { ok: true }

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));
Body wurde bereits gelesen. null

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);
Hallo Welt true

// Wichtig · Fallstricke

  • Ein zweiter Leseversuch bei bodyUsed === true führt zu einem abgelehnten Promise mit TypeError (z. B. „body stream already read“).
  • clone() muss vor dem Lesen aufgerufen werden, bei bodyUsed === true wirft clone() selbst einen TypeError.
  • bodyUsed sagt 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 über json() & Co. lesbar.
  • Die Eigenschaft ist schreibgeschützt; Zuweisungen werden ignoriert (im Strict Mode: TypeError).
  • Gleiche Eigenschaft existiert auch auf Request (über das gemeinsame Body-Mixin). Unterstützt in allen modernen Browsern sowie Node.js ab Version 18 (natives fetch).