Hono — إطار العمل للويب على معايير الويب › الوسائط المدمجة 3 / 8 السابق التالي

تركيب البرمجية الوسيطة

تتيح لك وسيطة التركيب (Mount Middleware) تركيب تطبيق مبني بإطار عمل آخر داخل تطبيق Hono الخاص بك.

Import

import { Hono } from 'hono'
import { mount } from 'hono/mount'

الاستخدام

سجّل الوسيط بـ app.all() على مسار ينتهي بـ /*:

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

// Create itty-router application
const ittyRouter = IttyRouter()

// Handle `GET /itty-router/hello`
ittyRouter.get('/hello', () => new Response('Hello from itty-router'))

const app = new Hono()

app.all('/itty-router/*', mount(ittyRouter.handle))

افتراضيًا، يستقبل التطبيق المُثبَّت Request مع إزالة بادئة المسار المطابقة (path prefix) من عنوان URL الخاص به. الطلب إلى /itty-router/hello يصل إلى itty-router كـ /hello.

يُستدعى التطبيق المُثبَّت (mounted) كـ handler(request, c.env, c.executionCtx)، نفس وسائط Cloudflare Workers fetch المعالج. استخدم optionHandler لتمرير وسائط مختلفة.

الخيارات

يمكنك تمرير دالة أو كائن (object) كوسيط ثانٍ.

optionHandler: (c: Context) => unknown

يعيد الوسائط (arguments) الممرَّرة إلى التطبيق المُثبَّت (mounted) بعد Request. يتم توسيع المصفوفة إلى عدة وسائط. يمكنك تمرير الدالة مباشرة كوسيطة ثانية:

import { Hono } from 'hono'
import { mount } from 'hono/mount'
const app = new Hono()
const anotherApp = (request: Request, ...args: unknown[]) =>
  new Response(request.url)
// ---cut---
// Call `anotherApp(request, c.env)`
app.all(
  '/app/*',
  mount(anotherApp, (c) => c.env)
)

// Call `anotherApp(request, c.env, c.executionCtx)`
app.all(
  '/app/*',
  mount(anotherApp, {
    optionHandler: (c) => [c.env, c.executionCtx],
  })
)

replaceRequest: ((originalRequest: Request) => Request) | false

يتحكم في أي Request يُمرَّر إلى التطبيق المُثبَّت:

import { Hono } from 'hono'
import { mount } from 'hono/mount'
const app = new Hono()
const anotherApp = (request: Request, ...args: unknown[]) =>
  new Response(request.url)
// ---cut---
// `/legacy/users` reaches the mounted application as `/api/users`
app.all(
  '/legacy/*',
  mount(anotherApp, {
    replaceRequest: (req) => {
      const url = new URL(req.url)
      url.pathname = url.pathname.replace(/^\/legacy/, '/api')
      return new Request(url, req)
    },
  })
)

لتمرير الأصلي Request دون تغيير، اضبطه على false كاختصار لـ (req) => req:

import { Hono } from 'hono'
import { mount } from 'hono/mount'
const app = new Hono()
const anotherApp = (request: Request, ...args: unknown[]) =>
  new Response(request.url)
// ---cut---
app.all(
  '/app/*',
  mount(anotherApp, {
    replaceRequest: false,
  })
)