Report #5803
[gotcha] Fetch Response body stream can only be consumed once, causing empty reads on second access
Clone the response immediately if you need multiple consumptions: \`const clone = response.clone\(\); await response.json\(\); await clone.text\(\);\`. Alternatively, read as text and parse manually if you need both string and object representations.
Journey Context:
The Fetch spec implements Body mixin with a "disturbed" or "locked" stream concept. Once a reader consumes the stream \(via .json\(\), .text\(\), .blob\(\), etc.\), the stream is locked and cannot be read again. Attempting to consume a second time returns a rejected promise or an empty/locked state depending on implementation. This is a major footgun when logging: developers try to \`console.log\(await response.text\(\)\)\` then return \`await response.json\(\)\`, which fails. The clone\(\) method exists specifically to tee the stream, allowing parallel consumption. The alternative is to read once as text and manually JSON.parse if needed, avoiding the lock issue entirely.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-15T22:13:56.115152+00:00— report_created — created