Guide

路由器

使用路由拆分你的应用程序。

使用 h3 路由器可以实现更高级和便利的路由系统,比如参数和 HTTP 方法,而 app 实例 本身只允许静态前缀匹配。

在内部,h3 使用 unjs/radix3 进行路由匹配。

使用方法

首先,你需要使用 createRouter 工具创建一个路由器,并将其添加到应用栈中。

import { createApp, createRouter } from "h3";

const app = createApp();
const router = createRouter();
app.use(router);

然后,你可以使用一个方法来注册路由,该方法的名称是 HTTP 方法:

router.get("/hello", () => "Hello world!");

在这个例子中,我们为 GET 方法注册了一个路由。这意味着事件处理程序仅在 /hello 路由的 GET 请求时被调用。如果你尝试发送 POST 请求或请求 /hello/world,事件处理程序将不会被调用。

你仍然可以使用 use 来注册一个事件处理程序到路由器,它会被所有 HTTP 方法调用。

这意味着你可以为同一路由注册多个不同方法的事件处理程序:

router
  .get("/hello", () => "GET Hello world!")
  .post("/hello", () => "POST Hello world!");

路由参数

你可以在路由中使用 : 前缀定义参数:

router.get("/hello/:name", (event) => {
  return `Hello ${event.context.params.name}!`;
});

在这个例子中,name 参数将会在 event.context.params 对象中可用。

如果你发送请求到 /hello/world,事件处理程序将返回 Hello world!

你可以在路由中使用任意数量的参数。

通配符匹配器

你可以使用 * 代替命名参数,用于未命名的情况:

router.get("/hello/*", (event) => `Hello ${event.context.params._}!`);

这将匹配 /hello 及其子路由,比如 /hello/world/hello/123,但仅会匹配一层子路由。

你可以使用 event.context.params._ 访问通配符内容,其中 _ 是一个包含通配符内容的字符串。

如果你需要匹配多层子的路由,可以使用 ** 前缀:

router.get("/hello/**", (event) => `Hello ${event.context.params._}!`);

这将匹配 /hello/hello/world/hello/123/hello/world/123 等等。

参数 _ 将以单个字符串的形式存储完整的通配符内容。

嵌套路由器

你可以嵌套路由器以创建路由器树。这有助于将应用程序拆分为多个部分,如 API 和网站。

import { createApp, createRouter, useBase } from "h3";

export const app = createApp();

const websiteRouter = createRouter().get("/", () => "Hello world!");

const apiRouter = createRouter().get("/hello", () => "Hello API!");

websiteRouter.use("/api/**", useBase("/api", apiRouter.handler));

app.use(websiteRouter);

我们创建了两个路由器。第一个被称为 websiteRouter 是主路由器。第二个是名为 apiRouter 的路由器。

然后,我们使用 use 和一个通配符连接 apiRouterwebsiteRouter,以确保所有以 /api 开头的路由和 HTTP 方法都将由 apiRouter 处理。

不要忘记使用 .handler 从路由器中获取事件处理程序。

useBase 用于为路由器的每个路由添加一个前缀。在这个例子中,我们给 apiRouter 的每个路由添加了 /api 前缀。因此,路由 /hello 将变为 /api/hello

最后,我们将 websiteRouter 注册到 app 实例中。