Skip to content

参考:Hono API、运行时与中间件速查

基于 Hono v4 · 核于 2026-08

速查

  • 核心 APInew Hono() 建实例、app.get/post/... 注册路由、app.use(path, mw) 挂中间件、app.route(path, subApp) 挂子应用、app.fetch(request) 核心 fetch handler、app.fire() 自动绑定运行时。
  • Context(c)c.req(请求)、c.json/text/html/redirect(响应助手)、c.header/headers(头)、c.status(状态码)、c.env(运行时环境绑定)、c.set/get(请求级变量)、c.var(变量对象)、c.exec(执行)。
  • c.req 方法param(key)(路径参数)、query(key)(查询串)、json()(JSON body)、text()(文本 body)、header(name)(请求头)、arrayBuffer()/blob()/formData()(其他 body)、raw(原生 Request)。
  • 运行时适配器:CF Workers(原生 export default)、Deno(Deno.serve)、Bun(Bun.serve)、Node(@hono/node-server)、Vercel Edge(export default)、AWS Lambda(hono/aws-lambda)。
  • 路由器:RegExpRouter(默认,最快)、LinearRouter(大量路由)、TrieRouter、PatternRouter(最轻)。
  • Hono RPChc<AppType>(baseUrl) 创建客户端,client.path.$method() 类型安全调用。
  • 官方中间件:hono/middleware 提供 logger/cors/secureHeaders/basicAuth/bearerAuth/compress/jsx/renderer/etag 等。
  • 辅助库:hono/validator(请求校验)、hono/zod(Zod 集成)、hono/type-validator(类型校验)。

一、app 对象核心方法

方法说明示例
new Hono()创建应用const app = new Hono()
app.METHOD(path, ...handlers)注册路由app.get('/users/:id', handler)
app.use(path, ...middleware)挂中间件app.use('*', logger())
app.route(path, subApp)挂子应用app.route('/api', apiApp)
app.fetch(request, env?)核心 fetch handler适配器调用它
app.fire()自动绑定运行时部分运行时用
app.notFound(handler)404 处理app.notFound((c) => c.text('404', 404))
app.onError(handler)错误处理app.onError((err, c) => c.json({err}, 500))
app.onError(err => ...)全局错误兜底
  • METHOD:get/post/put/delete/patch/all。
  • 链式调用new Hono().get(...).post(...) 可链式注册,便于类型推断(RPC 需要)。

二、Context(c)对象

属性/方法说明
c.req请求对象(封装 Request)
c.json(data, status?, headers?)返回 JSON Response
c.text(text, status?, headers?)返回文本 Response
c.html(html, status?, headers?)返回 HTML Response
c.redirect(location, status?)重定向
c.header(name, value)设置响应头
c.status(code)设置状态码
c.env运行时环境(CF Workers 的 KV/D1/R2 绑定等)
c.set(key, value)设置请求级变量
c.get(key)获取请求级变量
c.var变量对象(TS 类型扩展点)
c.executionCtx运行时执行上下文(如 Workers 的 waitUntil)
c.error当前错误(onError 中)

三、c.req 方法

方法说明
c.req.param(key?)路径参数(:id),不传 key 返回全部
c.req.query(key?)查询串(?a=1),不传 key 返回全部
c.req.queries(key)同名多值查询串
c.req.header(name)请求头
c.req.json()解析 JSON body(async)
c.req.text()解析文本 body(async)
c.req.arrayBuffer()ArrayBuffer body
c.req.blob()Blob body
c.req.formData()FormData body
c.req.parseBody()解析 multipart(文件上传)
c.req.raw原生 Request 对象
c.req.urlURL 字符串
c.req.methodHTTP 方法
c.req.routePath匹配的路由路径

四、运行时适配器清单

运行时适配器/包启动方式
Cloudflare Workers内置(原生)export default app(app.fetch 即 fetch handler)
Deno内置Deno.serve(app.fetch)
Bun内置export default { port, fetch: app.fetch }
Node.js@hono/node-serverserve({ fetch: app.fetch, port })
Vercel Edge内置(Edge Runtime)export default app
AWS Lambdahono/aws-lambdahandle(app) 适配 API Gateway
Lagon内置平台自动调用
Deno Deploy内置Deno.serve(app.fetch)
  • CF Workers 用 c.env:访问 KV/D1/R2/Queue 等绑定(c.env.MY_KV.get(key))。
  • Node 适配器:因 Node 无原生 Request/Response(18+ 才部分支持),@hono/node-server 做转换。

五、路由器(Router)

路由器特点选用
RegExpRouter编译期生成正则,匹配最快默认,路由数 < 数千
LinearRouter线性匹配,启动快大量路由(数千+),启动性能优先
TrieRouter字典树,复杂优先级需要复杂路由优先级
PatternRouter模式匹配,最轻量极端体积约束
ts
import { Hono } from "hono";
import { RegExpRouter } from "hono/router/reg-exp-router";
const app = new Hono({ router: new RegExpRouter() });

六、官方中间件(hono/middleware)

中间件作用
logger()HTTP 请求日志
cors()跨域
secureHeaders()安全头
basicAuth(...)Basic 认证
bearerAuth(...)Bearer Token 认证
compress()gzip 压缩
etag()ETag 缓存
prettyJson()JSON 美化
jsx()JSX 渲染(SSR)
renderer()布局渲染
cache(...)缓存响应
timeout(...)超时

七、Hono vs Express vs Fastify 对比

维度HonoExpressFastify
运行时CF/Deno/Bun/Node/Edge仅 Node仅 Node
API 风格Web Standards(Request/Response)自有 req/res 回调自有 request/reply async
体积< 20KB较大
性能边缘超快基准 1xNode 内 2-3x
Schema 验证validator/zod 集成需第三方内建 JSON Schema
TS 支持一等公民需 @types一等公民
RPCHono RPC(端到端类型)
场景边缘/跨运行时通用 Node 后端高 QPS Node 服务

八、易错点清单

  • Node 跑 Hono 需适配器:直接 app.listen 不行(Hono 无此方法),要用 @hono/node-serverserve({ fetch: app.fetch })
  • c.env 在 Node 是空c.env 是运行时环境绑定(CF Workers 的 KV/D1),Node 没有,需用 c.set() 自己传。
  • 中间件忘 await next():洋葱模型,不 await next 就不放行,请求挂起。
  • RPC 需链式注册hc<AppType> 要求路由用链式(.get().post())注册,类型才能正确推断。
  • body 解析是 asyncc.req.json() 返回 Promise,要 await
  • RegExpRouter 在大量路由时编译慢:数千+ 路由用 LinearRouter。
  • Web Standards 与 Express 习惯不同c.req.param() 不是 req.params.idc.json() 不是 res.json()

九、进阶方向(链接其他叶)

权威链接