4.7 KiB
Workerd Gotchas
Common Errors
"Missing compatibility date"
Cause: Compatibility date not set Solution: ❌ Wrong:
const worker :Workerd.Worker = (
serviceWorkerScript = embed "worker.js"
)
✅ Correct:
const worker :Workerd.Worker = (
serviceWorkerScript = embed "worker.js",
compatibilityDate = "2024-01-15" # Always set!
)
Wrong Binding Type
Problem: JSON not parsed
Cause: Using text = '{"key":"value"}' instead of json
Solution: Use json = '{"key":"value"}' for parsed objects
Service vs Namespace
Problem: Cannot create DO instance
Cause: Using service = "room-service" for Durable Object
Solution: Use durableObjectNamespace = "Room" for DO bindings
Module Name Mismatch
Problem: Import fails
Cause: Module name includes path: name = "src/index.js"
Solution: Use simple names: name = "index.js", embed with path
Network Access
Problem: Fetch fails with network error Cause: No network service configured (workerd has no global fetch) Solution: Add network service binding:
services = [(name = "internet", network = (allow = ["public"]))]
bindings = [(name = "NET", service = "internet")]
Or external service:
bindings = [(name = "API", service = (external = (address = "api.com:443", http = (style = tls))))]
"Worker not responding"
Cause: Socket misconfigured, no fetch handler, or port unavailable
Solution: Verify socket address matches, worker exports fetch(), port available
"Binding not found"
Cause: Name mismatch or service doesn't exist
Solution: Check binding name in config matches code (env.BINDING for ES modules)
"Module not found"
Cause: Module name doesn't match import or bad embed path
Solution: Module name must match import path exactly, verify embed path
"Compatibility error"
Cause: Date not set or API unavailable on that date
Solution: Set compatibilityDate, verify API available on that date
Performance Issues
Problem: High memory usage Cause: Large caches or many isolates Solution: Set cache limits, reduce isolate count, or use V8 flags (caution)
Problem: Slow startup
Cause: Many modules or complex config
Solution: Compile to binary (workerd compile), reduce imports
Problem: Request timeouts Cause: External service issues or DNS problems Solution: Check connectivity, DNS resolution, TLS handshake
Build Issues
Problem: Cap'n Proto syntax errors
Cause: Invalid config or missing schema
Solution: Install capnproto tools, validate: capnp compile -I. config.capnp
Problem: Embed path not found Cause: Path relative to config file Solution: Use correct relative path or absolute path
Problem: V8 flags cause crashes Cause: Unsafe V8 flags Solution: ⚠️ V8 flags unsupported in production. Test thoroughly before use.
Security Issues
Problem: Hardcoded secrets in config
Cause: text binding with secret value
Solution: Use fromEnvironment to load from env vars
Problem: Overly broad network access
Cause: network = (allow = ["*"])
Solution: Restrict to allow = ["public"] or specific hosts
Problem: Extractable crypto keys
Cause: cryptoKey = (extractable = true, ...)
Solution: Set extractable = false unless export required
Compatibility Changes
Problem: Breaking changes after compat date update Cause: New flags enabled between dates Solution: Review compat dates docs, test locally first
Problem: "Compatibility date not supported" Cause: Workerd version older than compat date Solution: Update workerd binary (version = max compat date supported)
Limits
| Resource/Limit | Value | Notes |
|---|---|---|
| V8 flags | Unsupported in production | Use with caution |
| Compatibility date | Must match workerd version | Update if mismatch |
| Module count | Affects startup time | Many imports slow |
Troubleshooting Steps
- Enable verbose logging:
workerd serve config.capnp --verbose - Check logs: Look for error messages, stack traces
- Validate config:
capnp compile -I. config.capnp - Test bindings: Log
Object.keys(env)to verify - Check versions: Workerd version vs compat date
- Isolate issue: Minimal repro config
- Review schema: workerd.capnp
See configuration.md for config details, patterns.md for working examples, api.md for runtime APIs.