场景指南

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/d1env.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

下一步