Combine-Middleware
Die Combine-Middleware kombiniert mehrere Middleware-Funktionen zu einer einzigen Middleware. Sie stellt drei Funktionen bereit:
some- Führt nur eine der angegebenen Middleware-Funktionen aus.every- Führt alle angegebenen Middleware-Funktionen aus.except- Führt alle angegebenen Middleware-Funktionen nur aus, wenn eine Bedingung nicht erfüllt ist.
Import
import { Hono } from 'hono'
import { some, every, except } from 'hono/combine'Verwendung
Hier ist ein Beispiel für komplexe Zugriffskontrollregeln mit der Combine-Middleware.
import { Hono } from 'hono'
import { bearerAuth } from 'hono/bearer-auth'
import { getConnInfo } from '@hono/cloudflare-workers'
import { every, some } from 'hono/combine'
import { ipRestriction } from 'hono/ip-restriction'
import { rateLimit } from '@/my-rate-limit'
const app = new Hono()
app.use(
'*',
some(
every(
ipRestriction(getConnInfo, { allowList: ['192.168.0.2'] }),
bearerAuth({ token })
),
// If both conditions are met, rateLimit will not execute.
rateLimit()
)
)
app.get('/', (c) => c.text('Hello Hono!'))some
Führt die erste Middleware aus, die true zurückgibt. Die Middleware-Funktionen werden der Reihe nach angewendet. Sobald eine erfolgreich beendet wird, werden nachfolgende nicht mehr ausgeführt.
import { some } from 'hono/combine'
import { bearerAuth } from 'hono/bearer-auth'
import { myRateLimit } from '@/rate-limit'
// If client has a valid token, skip rate limiting.
// Otherwise, apply rate limiting.
app.use(
'/api/*',
some(bearerAuth({ token }), myRateLimit({ limit: 100 }))
)every
Führt alle Middleware-Funktionen aus und hält an, sobald eine fehlschlägt. Sie werden der Reihe nach angewendet. Wenn eine einen Fehler auslöst, werden nachfolgende nicht mehr ausgeführt.
import { some, every } from 'hono/combine'
import { bearerAuth } from 'hono/bearer-auth'
import { myCheckLocalNetwork } from '@/check-local-network'
import { myRateLimit } from '@/rate-limit'
// If client is in local network, skip authentication and rate limiting.
// Otherwise, apply authentication and rate limiting.
app.use(
'/api/*',
some(
myCheckLocalNetwork(),
every(bearerAuth({ token }), myRateLimit({ limit: 100 }))
)
)except
Führt alle Middleware-Funktionen aus, außer wenn die Bedingung erfüllt ist. Als Bedingung kannst du eine Zeichenfolge oder Funktion übergeben. Wenn mehrere Ziele abgeglichen werden sollen, übergib sie als Array.
import { except } from 'hono/combine'
import { bearerAuth } from 'hono/bearer-auth'
// If client is accessing public API, skip authentication.
// Otherwise, require a valid token.
app.use('/api/*', except('/api/public/*', bearerAuth({ token })))