OtterMind/Chat2DB · error · TypeError

The response body is empty.

Error message

The response body is empty.

What it means

sseFetch throws a TypeError when the response has no body (response.body is null/undefined). This check runs after the status-ok check, so the server returned a successful status but with an empty body — which is invalid for an SSE stream that must contain event data. The body stream is required for the downstream sseStream parser to iterate over chunks.

Source

Thrown at chat2db-community-client/src/components/SSERequest/sseFetch.ts:60

  /** ---------------------- response middleware ---------------------- */
  if (typeof middlewares.onResponse === 'function') {
    const modifiedResponse = await middlewares.onResponse(response);

    if (!(modifiedResponse instanceof Response)) {
      throw new TypeError('The options.onResponse must return a Response instance!');
    }

    response = modifiedResponse;
  }

  /** ---------------------- response check ---------------------- */
  if (!response.ok) {
    throw new TypeError(`Fetch failed with status ${response.status}`);
  }

  if (!response.body) {
    throw new TypeError('The response body is empty.');
  }

  /** ---------------------- return ---------------------- */
  return response;
};

export default SSEFetch;

View on GitHub (pinned to 5ee1e990e7)

Solutions

  1. Verify the backend SSE endpoint actually writes data to the response body.
  2. Check proxy configuration (disable buffering: proxy_buffering off; X-Accel-Buffering: no).
  3. Handle this specific error in the catch and show 'AI returned no response' to the user.
  4. Confirm the Content-Type header is text/event-stream and the endpoint is not being intercepted by a caching layer.

Example fix

// before
const response = await sseFetch(baseURL, requestInit);

// after
try {
  const response = await sseFetch(baseURL, requestInit);
  // ... process response.body
} catch (e) {
  if (e instanceof TypeError && /body is empty/i.test(e.message)) {
    onError('AI service returned an empty response. Check backend SSE configuration.');
    return;
  }
  throw e;
}
Defensive patterns

Strategy: try-catch

Type guard

function isEmptyBodyError(e: unknown): e is TypeError {
  return e instanceof TypeError && /body is empty/i.test(e.message);
}

Try / catch

try {
  const response = await sseFetch(baseURL, requestInit);
} catch (e) {
  if (isEmptyBodyError(e)) {
    onError('AI service returned no data. Check SSE/streaming backend configuration.');
    return;
  }
  throw e;
}

Prevention

When it happens

Trigger: The AI endpoint returns HTTP 200 with an empty body (Content-Length: 0). A misconfigured proxy strips the body. A streaming endpoint sends headers but closes the connection before any data. A redirect that resolves to an empty response.

Common situations: Reverse proxy (nginx/cloudflare) buffering configuration drops the stream body. Backend middleware that consumes or discards the body before the SSE handler writes. Network interruption after headers but before body data.

Related errors


AI-assisted analysis of OtterMind/Chat2DB@5ee1e990e7 (2026-08-14). Data as JSON: /api/errors/999d77416c38dc0b. Report an issue: GitHub.