跳转到内容

上手教程

这个教程带你写一个最小的待办清单 API,重点不在业务逻辑,而在三种存储绑定的接入方式差别。看完你应该能判断自己的场景该选哪个。

todo-worker/
├── src/
│ ├── index.ts # fetch 入口与路由
│ └── db.ts # 数据访问
├── wrangler.jsonc # Worker 名、兼容性日期、绑定声明
├── .dev.vars # 本地密钥,不要提交
├── package.json
└── test/
└── index.spec.ts
  • 文件夹todo-worker/ — Worker 项目根目录
  • src/index.ts — 导出 fetch 处理器,路由都在这
  • src/db.ts — 把绑定调用包一层,方便换存储
  • wrangler.jsonc — 声明 namecompatibility_date、绑定
  • .dev.vars — 本地开发用的 secret,被 gitignore 掉
  • test/index.spec.ts vitest-pool-worker 里跑单测
src/index.ts
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
if (url.pathname === '/todos' && request.method === 'GET') {
return Response.json(await listTodos(env));
}
if (url.pathname === '/todos' && request.method === 'POST') {
const body = await request.json<{ text: string }>();
const todo = await createTodo(env, body.text);
return Response.json(todo, { status: 201 });
}
return new Response('Not Found', { status: 404 });
},
} satisfies ExportedHandler<Env>;

三种都能实现这个待办清单,差别在一致性、延迟和查询能力。

适合读多写少、按已知 key 取的缓存类数据。最终一致性,写入后全球生效最多可能延迟 60 秒。

wrangler.jsonc
{ "kv_namespaces": [{ "binding": "STORE", "id": "..." }] }
src/db.ts
import { env } from 'cloudflare:workers';
export async function listTodos() {
const raw = await env.STORE.get('todos', 'json');
return raw ?? [];
}
export async function createTodo(text: string) {
const todos = (await env.STORE.get<todo[]>('todos', 'json')) ?? [];
const todo = { id: crypto.randomUUID(), text, done: false };
await env.STORE.put('todos', JSON.stringify([...todos, todo]));
return todo;
}

整个清单塞在一个 value 里,只在你数据量小的时候成立——KV 单 value 上限 25 MB,且这是全量读全量写。

终端窗口
npx wrangler dev

默认行为。KV/R2/D1 的数据落在 .wrangler/state,绑定不需要真实 id 也能跑,适合纯逻辑开发。

终端窗口
npx wrangler dev

试一下:

终端窗口
curl -s -X POST localhost:8787/todos -d '{"text":"写文档"}' -H 'content-type: application/json'
curl -s localhost:8787/todos

部署上线见快速开始,把它接到 CI 里见持续集成