Skip to main content

Mount Middleware

还没翻译译自英文(hono.dev)本页 14 段都还没译

Mount Middleware

The Mount Middleware lets you mount an application built with another framework into your Hono application.

Import

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

Usage

Register the middleware with app.all() on a path that ends with /*:

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))

By default, the mounted application receives a new Request with the matched path prefix removed from its URL. A request to /itty-router/hello reaches itty-router as /hello.

The mounted application is called as handler(request, c.env, c.executionCtx), the same arguments as a Cloudflare Workers fetch handler. Use optionHandler to pass different arguments.

Options

You can pass a function or an object as the second argument.

optional optionHandler: (c: Context) => unknown

Returns the arguments passed to the mounted application after the Request. An array is spread into multiple arguments. You can pass the function directly as the second argument:

// 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],
  })
)

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

Controls which Request is passed to the mounted application:

// `/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)
    },
  })
)

To pass the original Request unchanged, set it to false as a shorthand for (req) => req:

app.all(
  '/app/*',
  mount(anotherApp, {
    replaceRequest: false,
  })
)