Hono 是主要对象。
它是你首先要导入并一直使用到结束的对象。

import { Hono } from 'hono'

const app = new Hono()
//...

export default app // 用于 Cloudflare Workers 或 Bun

方法

Hono 实例包含以下方法。

  • app.HTTP_METHOD([path,]handler|middleware…)
  • app.all([path,]handler|middleware…)
  • app.on(method|method[], path|path[], handler|middleware…)
  • app.use([path,]middleware)
  • app.route(path, [app])
  • app.basePath(path)
  • app.notFound(handler)
  • app.onError(err, handler)
  • app.mount(path, anotherApp)
  • app.fire()
  • app.fetch(request, env, event)
  • app.request(path, options)

其中前几部分用于路由,请参考路由部分

未找到

app.notFound 允许你自定义未找到的响应。

app.notFound((c) => {
  return c.text('自定义 404 信息', 404)
})

错误处理

app.onError 用于处理错误并返回自定义响应。

app.onError((err, c) => {
  console.error(`${err}`)
  return c.text('自定义错误信息', 500)
})

fire()

app.fire() 自动添加一个全局 fetch 事件监听器。

这对于遵循Service Worker API的环境非常有用,如非 ES 模块的 Cloudflare Workers

app.fire() 为你执行以下操作:

addEventListener('fetch', (event: FetchEventLike): void => {
  event.respondWith(this.dispatch(...))
})

fetch()

app.fetch 将成为你应用的入口点。

对于 Cloudflare Workers,你可以使用以下代码:

export default {
  fetch(request: Request, env: Env, ctx: ExecutionContext) {
    return app.fetch(request, env, ctx)
  },
}

或者直接使用:

export default app

Bun:

export default app // [!code --]
export default {  // [!code ++]
  port: 3000, // [!code ++]
  fetch: app.fetch, // [!code ++]
} // [!code ++]

request()

request 是一个有用的方法,用于测试。

你可以传递一个 URL 或路径名来发送 GET 请求。
app 将返回一个 Response 对象。

test('GET /hello 正常', async () => {
  const res = await app.request('/hello')
  expect(res.status).toBe(200)
})

你也可以传递一个 Request 对象:

test('POST /message 正常', async () => {
  const req = new Request('Hello!', {
    method: 'POST',
  })
  const res = await app.request(req)
  expect(res.status).toBe(201)
})

mount()

mount() 允许你将使用其他框架构建的应用程序挂载到你的 Hono 应用程序中。

import { Router as IttyRouter } from 'itty-router'
import { Hono } from 'hono'

// 创建 itty-router 应用程序
const ittyRouter = IttyRouter()

// 处理 `GET /itty-router/hello`
ittyRouter.get('/hello', () => new Response('来自 itty-router 的问候'))

// Hono 应用程序
const app = new Hono()

// 挂载!
app.mount('/itty-router', ittyRouter.handle)

严格模式

严格模式默认是 true,并区分以下路由。

  • /hello
  • /hello/

app.get('/hello') 不会匹配 GET /hello/

通过将严格模式设置为 false,两个路径将被视为相同。

const app = new Hono({ strict: false })

路由器选项

router 选项指定要使用的路由器。默认路由器是 SmartRouter
如果你想使用 RegExpRouter,可以将其传递给新的 Hono 实例:

import { RegExpRouter } from 'hono/router/reg-exp-router'

const app = new Hono({ router: new RegExpRouter() })

泛型

你可以传递泛型来指定 Cloudflare Workers Bindings 和在 c.set/c.get 中使用的变量的类型。

type Bindings = {
  TOKEN: string
}

type Variables = {
  user: User
}

const app = new Hono<{ Bindings: Bindings; Variables: Variables }>()

app.use('/auth/*', async (c, next) => {
  const token = c.env.TOKEN // token 是 `string`
  // ...
  c.set('user', user) // user 应为 `User`
  await next()
})

← Node.js