最佳實踐
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.ts
和 books.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;
這樣,當您使用此路由時,類型可以被正確推斷。