1. The Root Cause: Receiving HTML Instead of JSON
// ❌ Broken pattern:
const res = await fetch('/api/data');
const data = await res.json(); // Throws if server returns HTML error!
// ✅ Safe production pattern:
const res = await fetch('/api/data');
if (!res.ok) {
const errorText = await res.text();
throw new Error(`HTTP ${res.status}: ${errorText.slice(0, 100)}`);
}
const data = await res.json();Always verify res.ok before parsing JSON responses.
2. Common JSON Syntax Violations
// ❌ Invalid JSON (Single quotes & trailing comma):
{
'status': 'success',
'items': [1, 2, 3,]
}
// ✅ Valid RFC 8259 JSON:
{
"status": "success",
"items": [1, 2, 3]
}Convert single quotes to double quotes and remove trailing commas.