Cloudflare Worker 中 D1 数据库绑定错误排查:D1 binding 'DB' not found in environment
在使用 Cloudflare Workers + D1 数据库时,部署到生产环境后经常遇到以下错误:
Failed to list users: Error: D1 binding 'DB' not found in environment
本地 wrangler dev 通常能正常运行,但部署后 env.DB 为 undefined,导致 Worker 无法访问数据库。这是一个典型的配置同步问题,很少是 D1 服务本身故障。
错误核心原因
Cloudflare Worker 的运行时(边缘环境)需要通过 binding 机制显式注入 D1 数据库实例。如果绑定未正确配置或未随 Worker 一起部署,env.DB 就会缺失。该错误在以下场景中最常见:
1. wrangler.toml 配置缺失或错误(最常见)
[[d1_databases]]
binding = "DB" # 必须与代码中的 env.DB 一致
database_name = "my-production-db"
database_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # 从 wrangler d1 list 获取
常见配置错误:
-
缺少
database_id -
binding名称大小写不匹配(dbvsDB) -
多环境(
[env.production])下未为对应环境配置 D1
2. Dashboard 与 wrangler 配置不同步
-
在 Cloudflare Dashboard 的 Workers → Settings → Bindings 中手动添加了 D1,但
wrangler deploy会以wrangler.toml为准进行覆盖。 -
反之亦然:仅在 Dashboard 配置,未提交到 toml 文件。
最佳实践:优先通过 wrangler.toml 统一管理配置,Dashboard 仅用于查看。
3. 代码访问方式不正确
确保在 Worker 入口文件中正确接收 env 参数:
export interface Env {
DB: D1Database; // 类型定义必须匹配
}
export default {
async fetch(request: Request, env: Env) {
if (!env.DB) {
return new Response("D1 binding 'DB' not found in environment", { status: 500 });
}
// 使用示例
const { results } = await env.DB.prepare("SELECT * FROM users").all();
return Response.json(results);
}
};
完整排查与修复流程
-
检查配置文件
运行wrangler d1 list获取正确的database_id,确认wrangler.toml配置无误。 -
本地验证
wrangler dev
若本地正常,问题基本出在部署配置。
-
重新部署
wrangler deploy --env production # 指定环境
-
Dashboard 验证
登录 Cloudflare Dashboard → Workers & Pages → 你的 Worker → Settings → Bindings,确认存在名称为DB的 D1 binding。 -
生成类型定义(TypeScript 项目)
wrangler types
-
清理重试
若仍失败,可删除 Worker 后重新wrangler deploy。