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 将继续执行主路由处理器。