跳至內容

最佳實踐

Hono 非常靈活。您可以按照自己的喜好編寫應用程式。但是,最好遵循一些最佳實踐。

盡可能不要建立「控制器」

在可能的情況下,您不應該建立「類似 Ruby on Rails 的控制器」。

ts
// 🙁
// A RoR-like Controller
const booksList = (c: Context) => {
  return c.json('list books')
}

app.get('/books', booksList)

這個問題與類型有關。例如,在沒有編寫複雜泛型的情況下,無法在控制器中推斷路徑參數。

ts
// 🙁
// A RoR-like Controller
const bookPermalink = (c: Context) => {
  const id = c.req.param('id') // Can't infer the path param
  return c.json(`get ${id}`)
}

因此,您不需要建立類似 RoR 的控制器,而應該在路徑定義後直接編寫處理程序。

ts
// 😃
app.get('/books/:id', (c) => {
  const id = c.req.param('id') // Can infer the path param
  return c.json(`get ${id}`)
})

hono/factory 中的 factory.createHandlers()

如果您仍然想建立類似 RoR 的控制器,請使用 hono/factory 中的 factory.createHandlers()。如果您使用這個,類型推斷將會正常運作。

ts
import { createFactory } from 'hono/factory'
import { logger } from 'hono/logger'

// ...

// 😃
const factory = createFactory()

const middleware = factory.createMiddleware(async (c, next) => {
  c.set('foo', 'bar')
  await next()
})

const handlers = factory.createHandlers(logger(), middleware, (c) => {
  return c.json(c.var.foo)
})

app.get('/api', ...handlers)

建立較大的應用程式

使用 app.route() 來建立較大的應用程式,而無需建立「類似 Ruby on Rails 的控制器」。

如果您的應用程式有 /authors/books 端點,並且您希望從 index.ts 中分離檔案,請建立 authors.tsbooks.ts

ts
// authors.ts
import { Hono } from 'hono'

const app = new Hono()

app.get('/', (c) => c.json('list authors'))
app.post('/', (c) => c.json('create an author', 201))
app.get('/:id', (c) => c.json(`get ${c.req.param('id')}`))

export default app
ts
// books.ts
import { Hono } from 'hono'

const app = new Hono()

app.get('/', (c) => c.json('list books'))
app.post('/', (c) => c.json('create a book', 201))
app.get('/:id', (c) => c.json(`get ${c.req.param('id')}`))

export default app

然後,導入它們並使用 app.route() 掛載到 /authors/books 路徑上。

ts
// index.ts
import { Hono } from 'hono'
import authors from './authors'
import books from './books'

const app = new Hono()

app.route('/authors', authors)
app.route('/books', books)

export default app

上面的程式碼可以正常運作。但是,這樣做會失去類型安全。如果您想使用 RPC 功能,更好的解決方案是按照以下描述鏈接方法。

ts
// authors.ts
import { Hono } from "hono";

const app = new Hono()
  .get("/", (c) => c.json("list authors"))
  .post("/", (c) => c.json("create an author", 201))
  .get("/:id", (c) => c.json(`get ${c.req.param("id")}`));

export default app;

這樣,當您使用此路由時,類型可以被正確推斷。

根據 MIT 許可發布。