Guide

Routing


添加路由

H3 应用实例内置了一个路由系统,用于注册匹配带有参数或特定 HTTP 方法的路由模式。

路由由 🌳 rou3 提供支持,它是一款超快且轻量的路由匹配引擎。

示例: 注册一个路由,匹配使用 HTTP GET 方法访问 /hello 端点的请求:

// 方法一:使用 app.[method]
app.get("/hello", () => "Hello world!");

// 方法二:使用 app.on(method)
app.on("GET", "/hello", () => "Hello world!");

你可以为同一路由注册多个不同方法的事件处理器:

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

你也可以使用 app.all 方法注册一个接受任何 HTTP 方法的路由:

app.all("/hello", (event) => `This is a ${event.req.method} request!`);

路由参数

你可以通过 : 前缀来定义路由中的参数:

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

在此示例中,name 参数将可通过 event.context.params 对象访问。

如果请求地址是 /hello/world,事件处理器将响应 Hello world!

除了命名参数,你也可以使用 * 表示未命名且可选的参数:

app.get("/hello/*", (event) => `Hello!`);

通配参数

添加 /hello/:name 路由会匹配 /hello/world/hello/123,但不会匹配 /hello/foo/bar

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

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

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

参数 _ 会存储完整的通配符内容,作为一个字符串。

添加中间件

你可以使用 app.use 向 app 实例注册中间件处理器

示例: 注册全局中间件,对每个路由调用。

app.use((event) => {
  console.log(event);
});

示例: 注册带路由匹配的中间件,仅匹配以 /blog 前缀开头的特定路由(即 /blog/blog/world/blog/123 等)。

app.use("/blog/**", (event) => {
  console.log(event);
});
不同类型的中间件执行顺序不同:
  • 全局 onRequest 钩子 总是在最前调用。
  • 没有路由模式的全局中间件会按注册顺序在所有其他处理器前调用。
  • 带路由模式的中间件会在全局中间件之后调用,顺序按路由模式从宽松到具体排列。
  • 如果没有中间件处理返回响应,将使用常规路由方法匹配器。

你可以定义多个中间件。

app.use(() => "First");
app.use(() => "Second");

上述示例中,第一个事件处理器会调用于每个请求,且第二个永远不会被调用

不过,如果第一个事件处理器不返回响应,第二个中间件才会被调用。这在实现 中间件 模式时非常有用。

app.use((event) => {
  console.log("First");
});

app.use((event) => {
  console.log("Second");
});

如果所有处理器都被调用且没有返回响应,h3 将继续执行主路由处理器。