场景指南
Cloudflare Workers
直接用 @downcity/city 在 Cloudflare Workers + D1 中部署 City,不需要额外的 edge package。
如果你准备把 Downcity 部署到 Cloudflare Workers,推荐做法不是等一个单独的 edge package,而是直接把 @downcity/city 接到 Workers runtime。
公开仓库里保留了 templates/edge 作为开发者快捷示例。Downcity 官方私有 Worker 实现维护在公开仓库之外。
这条路径解决什么
Cloudflare Workers 和 Node.js 最大的不同,不是 HTTP 入口,而是 runtime 资源模型不同:
- 数据库通常来自
env.DB这类 binding - 环境变量读取不再是本地
.env文件 - request origin 可能需要在每次请求时同步到 service
- Worker isolate 会复用,所以 runtime cache 需要自己管理
这也是为什么这里更适合用 guide 解释接法,而不是再抽一个空的 npm 包。
最小接法
City 需要的只是一个 Drizzle db 对象:
import { Federation } from "@downcity/city";
import { drizzle } from "drizzle-orm/d1";
export interface Env {
DB: D1Database;
}
export default {
async fetch(request: Request, env: Env) {
const db = drizzle(env.DB);
const base = new Federation({ db });
await base.health();
return base.fetch(request);
},
};这里的重点不是某个 helper 名字,而是你把数据库交给 City:
- D1 通过
drizzle-orm/d1得到 db - D1 属于 SQLite 方言,所以显式传
dialect: "sqlite" raw: env.DB交给需要底层 D1 对象的服务使用- 当前请求 origin 可以在请求前同步给需要 OAuth callback 的 service
从 templates/edge 快捷示例开始
仓库里的 templates/edge/src/index.ts 已经覆盖大多数项目需要的接入细节,包含这些关键点:
- 用
drizzle-orm/d1把env.DB接成 City 可用数据库 - City 启动时自动初始化内置
env/cities表 - 在每次请求前同步当前 origin,避免 OAuth callback 或外链使用错误域名
- 继续像 Node 路线一样注册
AIService、accounts、usage、payment 服务
如果你要做正式项目,建议从这个示例开始,再按产品调整模型目录、服务和 provider key。
和 Node 路线的边界
Worker 和 Node 现在是同一套心智模型:都创建 Drizzle db,然后传给 new Federation({ db })。
- Node.js 本地常用
drizzle-orm/better-sqlite3 - Node.js 生产可以用 Drizzle pg
- Workers / D1 用
drizzle-orm/d1
下一步
- 如果你还没搭 City 本体,先读 Federation
- 如果你要管理 provider key,继续读 provider 环境变量
- 如果你需要完整快捷示例,直接看 templates/edge/src/index.ts