Your Worker code threw an unhandled exception while handling the request. It's an application bug — find the exception in logs (wrangler tail or dash logs), don't guess from the 1101 page.
TypeError on undefined, JSON.parse on non-JSON, undefined env binding. The stack trace in `wrangler tail` or dashboard → Workers → Logs names the exact line.
Deploying with metadata that dropped or renamed a KV/D1/secret binding makes env.X undefined at runtime — code that worked last deploy now throws. Compare bindings in the deploy metadata.
Exceptions from exceeding limits surface as 1101-ish failures under traffic only. Look for 'Exceeded CPU' or 'Too many subrequests' in logs.
wrangler tail --format pretty # hit the failing URL: the exception + stack trace appear in the stream
wrangler deployments list 2>/dev/null || wrangler whoami ; # compare [vars]/bindings in wrangler.toml vs env usage in code
export default { async fetch(req, env, ctx) { try { return await handler(req, env); } catch (e) { return new Response('temporarily unavailable', { status: 500 }); } } }
# logs show 'Exceeded CPU' (optimize loops/AI calls) or 'Too many subrequests' (cache fetch results)
1101 pages are customer-visible — ship the try/catch so a bug becomes a 500 with logging instead of a Cloudflare-branded error page. Source maps deploy with wrangler by default in dev: production traces without them are much less useful; keep the upload.
wrangler tail (live) or dashboard → Workers & Pages → your worker → Logs (recent invocations). The stack trace includes the file and line — that's the whole debug.
Deploy metadata (bindings!) changed: a missing binding turns env.MY_KV into undefined and the first use throws. Diff the bindings in the deployment, not just the code.
Our most-documented failures, packaged as ready-to-ship starter kits: Docker, Kubernetes, and Terraform.
Browse the template store →One-time. Yours to modify. Instant download from the NinjaOps template store.