后端与接口
在 Cloudflare Workers 上用 Hono…
适用于基于 Cloudflare Workers/Pages 构建边缘 API、全栈应用或实时应用,并需要类型安全地使用 Cloudflare 绑定与 Serverless 存储、队列、定时任务等能力。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在 Cloudflare Workers特定
解决思路
- 用 `npm create hono@latest my-app` 创建项目,选择 `cloudflare-workers`,进入目录后执行 `npm install` 和 `npm run dev`。
- 保持项目结构为 `src/index.ts` 入口、`wrangler.toml` Cloudflare 配置、`package.json`、`tsconfig.json`。
- 在 `src/index.ts` 中 `import { Hono } from 'hono'`,创建 `const app = new Hono()`,添加路由如 `app.get('/', (c) => c.text('Hello Cloudflare Workers!'))`,并 `export default app`。
- 用 `npx wrangler deploy` 部署,用 `npx wrangler dev` 本地开发。
- 定义 `type Bindings` 声明环境变量、KV、D1、R2、Durable Objects、Queues、Service Bindings 等类型,并用 `new Hono<{ Bindings: Bindings }>()` 获得类型安全访问。
- 在处理器中通过 `c.env.API_KEY` 读取环境变量,并返回 JSON 如 `c.json({ configured: !!apiKey })`;不要模块级访问 env,应在 handler 中访问。
- 在 `wrangler.toml` 中配置 `name`、`main`、`compatibility_date`,并在 `[vars]` 设置变量;KV 用 `[[kv_namespaces]]` 配置 `binding` 和 `id`;D1 用 `[[d1_databases]]` 配置 `binding`、`database_name`、`database_id`;R2 用 `[[r2_buckets]]` 配置 `binding`、`bucket_name`;Queues 用 `[[queues.producers]]` 配置 `binding` 和 `queue`。
- KV 基本操作:用 `c.env.CACHE.get(key)` 读取值,用 `get(key, 'json')` 读取 JSON;用 `put(key, JSON.stringify(body), { expirationTtl: 3600 })` 写入并设置 TTL;用 `delete(key)` 删除;用 `list({ prefix, limit: 100 })` 列出键。
- KV 元数据:`put` 时传入 `metadata`(如 `createdAt`、`role`);读取时用 `getWithMetadata<UserMeta>(key, 'json')` 同时取 `value` 和 `metadata`。
- D1 基本查询:用 `c.env.DB.prepare('SELECT * FROM users ORDER BY created_at DESC').all()` 查所有;用 `.bind(id).first()` 查单条;用 `.bind(name, email).run()` 插入并读取 `result.meta.last_row_id`;用 `.bind(name, email, id).run()` 更新;用 `.bind(id).run()` 删除。
- D1 批量操作:将多条 `prepare(...).bind(...)` 放入数组,用 `c.env.DB.batch(statements)` 执行,并检查 `results.every(r => r.success)`。
- R2 操作:上传用 `c.env.BUCKET.put(key, body, { httpMetadata: { contentType } })`;下载用 `c.env.BUCKET.get(key)`,返回时设置 `Content-Type` 和 `ETag`;删除用 `delete(key)`;列出用 `list({ prefix, limit: 100 })` 并映射 `key`、`size`、`uploaded`。
- Durable Objects:定义类如 `Counter`,构造函数接收 `state: DurableObjectState`,在 `fetch` 中根据 URL 路径处理 `/increment`、`/decrement`、`/value`,通过 `this.state.storage.get/put` 持久化值。
- 在 Hono 中使用 Durable Objects:用 `c.env.COUNTER.idFromName(name)` 和 `c.env.COUNTER.get(id)` 获取 stub,再 `stub.fetch('http://counter/increment')` 调用;同时从入口 `export { Counter }`。
- 在 `wrangler.toml` 中为 Durable Objects 配置 `[[durable_objects.bindings]]`(`name`、`class_name`)和 `[[migrations]]`(`tag`、`new_classes`)。
- Queues 生产者:用 `c.env.MY_QUEUE.send({ type: 'process', data: task })` 发送单条;用 `sendBatch(tasks.map(task => ({ body: { type: 'process', data: task } })))` 批量发送。
- Queues 消费者:在默认导出的 `queue(batch, env)` 中遍历 `batch.messages`,处理成功后 `message.ack()`,失败时 `message.retry()`;同时保留 `fetch: app.fetch`。
- 静态资源:在 `wrangler.toml` 中用 `assets = { directory = "public" }` 配置;或在 Hono 中 `import { serveStatic } from 'hono/cloudflare-workers'` 并 `app.use('/static/*', serveStatic({ root: './' }))`。
- 定时任务:默认导出中实现 `scheduled(event, env, ctx)`,按 `event.cron` 分支执行任务;在 `wrangler.toml` 中 `[triggers]` 的 `crons = ["0 * * * *", "0 0 * * *"]` 配置。
- Cloudflare Pages:将静态资源放 `public/`,函数放 `functions/[[path]].ts`;在函数中 `import { handle } from 'hono/cloudflare-pages'`,创建 Hono 应用并用 `export const onRequest = handle(app)`。
- 中间件中访问绑定:用 `createMiddleware<{ Bindings: Bindings }>(async (c, next) => { ... })`,在处理器内读取 `c.env.API_KEY`,校验请求头如 `X-API-Key`,不通过返回 401,否则 `await next()`。
- 类型速查:Bindings 可声明 `MY_VAR: string`、`MY_KV: KVNamespace`、`DB: D1Database`、`BUCKET: R2Bucket`、`MY_DO: DurableObjectNamespace`、`MY_QUEUE: Queue`、`OTHER_WORKER: Fetcher`。
- 常用命令:`npx wrangler dev` 本地开发,`npx wrangler deploy` 部署,`npx wrangler d1 create my-database` 创建 D1,`npx wrangler d1 execute my-database --file=schema.sql` 执行 SQL,`npx wrangler kv:namespace create MY_KV` 创建 KV 命名空间,`npx wrangler r2 bucket create my-bucket` 创建 R2 桶,`npx wrangler tail` 跟踪日志。
- 可参考相关技能 `hono-core`、`hono-middleware`、`hono-testing`;当前技能面向 Hono 4.x、Wrangler 3.x,最后更新于 2025 年 1 月,MIT 许可。
适用边界 · 注意事项
- 不适用于非 Cloudflare Workers/Pages 运行时,或希望避免 Cloudflare 厂商锁定的项目。
- 不适用于不使用 KV、D1、R2、Durable Objects、Queues 等 Cloudflare 绑定的纯 Hono 应用。
- 不适用于不希望使用 Wrangler 进行配置、开发与部署的流程。