路由器
使用 h3 路由器可以实现更高级和便利的路由系统,比如参数和 HTTP 方法,而 app 实例 本身只允许静态前缀匹配。
使用方法
首先,你需要使用 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
和一个通配符连接 apiRouter
到 websiteRouter
,以确保所有以 /api
开头的路由和 HTTP 方法都将由 apiRouter
处理。
.handler
从路由器中获取事件处理程序。useBase
用于为路由器的每个路由添加一个前缀。在这个例子中,我们给 apiRouter
的每个路由添加了 /api
前缀。因此,路由 /hello
将变为 /api/hello
。
最后,我们将 websiteRouter
注册到 app
实例中。