Factory-Helfer
Der Factory-Helfer stellt nützliche Funktionen zum Erstellen von Hono-Komponenten wie Middleware bereit. Die korrekte Angabe von TypeScript-Typen ist manchmal schwierig; dieser Helfer erleichtert sie.
Import
import { Hono } from 'hono'
import { createFactory, createMiddleware } from 'hono/factory'createFactory()
createFactory() erstellt eine Instanz der Klasse Factory.
import { createFactory } from 'hono/factory'
const factory = createFactory()Du kannst deine Env-Typen als generische Typparameter übergeben:
type Env = {
Variables: {
foo: string
}
}
const factory = createFactory<Env>()Optionen
optional defaultAppOptions: HonoOptions
Die Standardoptionen, die an die mit createApp() erstellte Hono-Anwendung übergeben werden.
const factory = createFactory({
defaultAppOptions: { strict: false },
})
const app = factory.createApp() // `strict: false` is appliedcreateMiddleware()
createMiddleware() ist eine Kurzform für factory.createMiddleware(). Diese Funktion erstellt deine benutzerdefinierte Middleware.
const messageMiddleware = createMiddleware(async (c, next) => {
await next()
c.res.headers.set('X-Message', 'Good morning!')
})Tipp: Wenn du ein Argument wie message entgegennehmen möchtest, kannst du die Middleware wie folgt als Funktion erstellen.
const messageMiddleware = (message: string) => {
return createMiddleware(async (c, next) => {
await next()
c.res.headers.set('X-Message', message)
})
}
app.use(messageMiddleware('Good evening!'))factory.createHandlers()
createHandlers() hilft dir, Handler an einer anderen Stelle als bei app.get('/') zu definieren.
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)factory.createApp()
createApp() hilft beim Erstellen einer Hono-Instanz mit den passenden Typen. Zusammen mit createFactory() vermeidest du redundante Definitionen des Typs Env.
Bei einer Anwendung wie dieser musst du Env an zwei Stellen festlegen:
import { createMiddleware } from 'hono/factory'
type Env = {
Variables: {
myVar: string
}
}
// 1. Set the `Env` to `new Hono()`
const app = new Hono<Env>()
// 2. Set the `Env` to `createMiddleware()`
const mw = createMiddleware<Env>(async (c, next) => {
await next()
})
app.use(mw)Mit createFactory() und createApp() musst du Env nur an einer Stelle festlegen.
import { createFactory } from 'hono/factory'
// ...
// Set the `Env` to `createFactory()`
const factory = createFactory<Env>()
const app = factory.createApp()
// factory also has `createMiddleware()`
const mw = factory.createMiddleware(async (c, next) => {
await next()
})createFactory() kann die Option initApp entgegennehmen, um eine mit createApp() erstellte app zu initialisieren. Das folgende Beispiel verwendet diese Option.
// factory-with-db.ts
type Env = {
Bindings: {
MY_DB: D1Database
}
Variables: {
db: DrizzleD1Database
}
}
export default createFactory<Env>({
initApp: (app) => {
app.use(async (c, next) => {
const db = drizzle(c.env.MY_DB)
c.set('db', db)
await next()
})
},
})// crud.ts
import factoryWithDB from './factory-with-db'
const app = factoryWithDB.createApp()
app.post('/posts', (c) => {
c.var.db.insert()
// ...
})