Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Comprehensive Cloudflare platform skill covering Workers, D1, R2, KV, AI, Durable Objects, and security.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/bindings/gotchas.md
1# Binding Gotchas and Troubleshooting23## Critical: Global Scope Mutation45### ❌ THE #1 GOTCHA: Caching env in Global Scope67```typescript8// ❌ DANGEROUS - env cached at deploy time9const apiKey = env.API_KEY; // ERROR: env not available in global scope1011export default {12async fetch(request: Request, env: Env) {13// Uses undefined or stale value!14}15}16```1718**Why it breaks:**19- `env` not available in global scope20- If using workarounds, secrets may not update without redeployment21- Leads to "Cannot read property 'X' of undefined" errors2223**✅ Always access env per-request:**24```typescript25export default {26async fetch(request: Request, env: Env) {27const apiKey = env.API_KEY; // Fresh every request28}29}30```3132## Common Errors3334### "env.MY_KV is undefined"3536**Cause:** Name mismatch or not configured37**Solution:** Check wrangler.jsonc (case-sensitive), run `npx wrangler types`, verify `npx wrangler kv namespace list`3839### "Property 'MY_KV' does not exist on type 'Env'"4041**Cause:** Types not generated42**Solution:** `npx wrangler types`4344### "preview_id is required for --remote"4546**Cause:** Missing preview binding47**Solution:** Add `"preview_id": "dev-id"` or use `npx wrangler dev` (local mode)4849### "Secret updated but Worker still uses old value"5051**Cause:** Cached in global scope or not redeployed52**Solution:** Avoid global caching, redeploy after secret change5354### "KV get() returns null for existing key"5556**Cause:** Eventual consistency (60s), wrong namespace, wrong environment57**Solution:**58```bash59# Check key exists60npx wrangler kv key get --binding=MY_KV "your-key"6162# Verify namespace ID63npx wrangler kv namespace list6465# Check environment66npx wrangler deployments list67```6869### "D1 database not found"7071**Solution:** `npx wrangler d1 list`, verify ID in wrangler.jsonc7273### "Service binding returns 'No such service'"7475**Cause:** Target Worker not deployed, name mismatch, environment mismatch76**Solution:**77```bash78# List deployed Workers79npx wrangler deployments list --name=target-worker8081# Check service binding config82cat wrangler.jsonc | grep -A2 services8384# Deploy target first85cd ../target-worker && npx wrangler deploy86```8788### "Rate limit exceeded" on KV writes8990**Cause:** >1 write/second per key91**Solution:** Use different keys, Durable Objects, or Queues9293## Type Safety Gotchas9495### Missing @cloudflare/workers-types9697**Error:** `Cannot find name 'Request'`98**Solution:** `npm install -D @cloudflare/workers-types`, add to tsconfig.json `"types"`99100### Binding Type Mismatches101102```typescript103// ❌ Wrong - KV returns string | null104const value: string = await env.MY_KV.get('key');105106// ✅ Handle null107const value = await env.MY_KV.get('key');108if (!value) return new Response('Not found', { status: 404 });109```110111## Environment Gotchas112113### Wrong Environment Deployed114115**Solution:** Check `npx wrangler deployments list`, use `--env` flag116117### Secrets Not Per-Environment118119**Solution:** Set per environment: `npx wrangler secret put API_KEY --env staging`120121## Development Gotchas122123**wrangler dev vs deploy:**124- dev: Uses `preview_id` or local bindings, secrets not available125- deploy: Uses production `id`, secrets available126127**Access secrets in dev:** `npx wrangler dev --remote`128**Persist local data:** `npx wrangler dev --persist`129130## Performance Gotchas131132### Sequential Binding Calls133134```typescript135// ❌ Slow136const user = await env.DB.prepare('...').first();137const config = await env.MY_KV.get('config');138139// ✅ Parallel140const [user, config] = await Promise.all([141env.DB.prepare('...').first(),142env.MY_KV.get('config')143]);144```145146## Security Gotchas147148**❌ Secrets in logs:** `console.log('Key:', env.API_KEY)` - visible in dashboard149**✅** `console.log('Key:', env.API_KEY ? '***' : 'missing')`150151**❌ Exposing env:** `return Response.json(env)` - exposes all bindings152**✅** Never return env object in responses153154## Limits Reference155156| Resource | Limit | Impact | Plan |157|----------|-------|--------|------|158| **Bindings per Worker** | 64 total | All binding types combined | All |159| **Environment variables** | 64 max, 5KB each | Per Worker | All |160| **Secret size** | 1KB | Per secret | All |161| **KV key size** | 512 bytes | UTF-8 encoded | All |162| **KV value size** | 25 MB | Per value | All |163| **KV writes per key** | 1/second | Per key; exceeding = 429 error | All |164| **KV list() results** | 1000 keys | Per call; use cursor for more | All |165| **KV operations** | 1000 reads/day | Free tier only | Free |166| **R2 object size** | 5 TB | Per object | All |167| **R2 operations** | 1M Class A/month free | Writes | All |168| **D1 database size** | 10 GB | Per database | All |169| **D1 rows per query** | 100,000 | Result set limit | All |170| **D1 databases** | 10 | Free tier | Free |171| **Queue batch size** | 100 messages | Per consumer batch | All |172| **Queue message size** | 128 KB | Per message | All |173| **Service binding calls** | Unlimited | Counts toward CPU time | All |174| **Durable Objects** | 1M requests/month free | First 1M | Free |175176## Debugging Tips177178```bash179# Check configuration180npx wrangler deploy --dry-run # Validate config without deploying181npx wrangler kv namespace list # List KV namespaces182npx wrangler secret list # List secrets (not values)183npx wrangler deployments list # Recent deployments184185# Inspect bindings186npx wrangler kv key list --binding=MY_KV187npx wrangler kv key get --binding=MY_KV "key-name"188npx wrangler r2 object get my-bucket/file.txt189npx wrangler d1 execute my-db --command="SELECT * FROM sqlite_master"190191# Test locally192npx wrangler dev # Local mode193npx wrangler dev --remote # Production bindings194npx wrangler dev --persist # Persist data across restarts195196# Verify types197npx wrangler types198cat .wrangler/types/runtime.d.ts | grep "interface Env"199200# Debug specific binding issues201npx wrangler tail # Stream logs in real-time202npx wrangler tail --format=pretty # Formatted logs203```204205## See Also206207- [Workers Limits](https://developers.cloudflare.com/workers/platform/limits/)208- [Wrangler Commands](https://developers.cloudflare.com/workers/wrangler/commands/)209