[ PROMPT_NODE_24488 ]
Workers 常见陷阱
[ SKILL_DOCUMENTATION ]
# Workers 常见陷阱
## 常见错误
### "Too much CPU time used"
**原因:** Worker 超出了 CPU 时间限制(标准 10ms,无限制 30ms)
**解决方案:** 使用 `ctx.waitUntil()` 处理后台任务,将繁重的计算任务卸载到 Durable Objects,或考虑使用 Workers AI 进行机器学习工作负载。
### "Module-Level State Lost"
**原因:** Workers 在请求之间是无状态的;模块级变量会不可预测地重置
**解决方案:** 使用 KV、D1 或 Durable Objects 存储持久状态;不要依赖模块级变量。
### "Body has already been used"
**原因:** 尝试读取响应体两次(响应体是流)
**解决方案:** 在读取前克隆响应:`response.clone()`,或者读取一次后使用文本内容创建新的 Response。
### "Node.js module not found"
**原因:** 默认情况下无法使用 Node.js 内置模块
**解决方案:** 使用 Workers API(例如 R2 用于文件存储),或在 `"compatibility_flags": ["nodejs_compat_v2"]` 中启用 Node.js 兼容性。
### "Cannot fetch in global scope"
**原因:** 尝试在模块初始化期间使用 fetch
**解决方案:** 将 fetch 调用移动到允许的处理器函数(fetch, scheduled 等)内部。
### "Subrequest depth limit exceeded"
**原因:** 嵌套的子请求过多,导致调用链过深
**解决方案:** 扁平化请求链,或使用服务绑定进行 Worker 到 Worker 的直接通信。
### "D1 read-after-write inconsistency"
**原因:** D1 是最终一致性的;读取操作可能无法反映最近的写入
**解决方案:** 使用 D1 Sessions (2024+) 来保证会话内的读写一致性:
typescript
const session = env.DB.withSession();
await session.prepare('INSERT INTO users (name) VALUES (?)').bind('Alice').run();
const user = await session.prepare('SELECT * FROM users WHERE name = ?').bind('Alice').first(); // 保证能看到 Alice
**何时使用会话:** 写 → 读模式,需要一致性的事务。
### "wrangler types not generating TypeScript definitions"
**原因:** 类型生成未配置或已过期
**解决方案:** 在修改 wrangler.jsonc 中的绑定后运行 `npx wrangler types`:
bash
npx wrangler types # 生成 .wrangler/types/runtime.d.ts
在 `tsconfig.json` 中添加:`"include": [".wrangler/types/**/*.ts"]`
然后导入:`import type { Env } from './.wrangler/types/runtime';`
### "Durable Object RPC errors with deprecated fetch pattern"
**原因:** 使用了旧的 `stub.fetch()` 模式而非 RPC (2024+)
**解决方案:** 导出