路由
¥Routing
每个请求都与一个(最具体的)路由处理程序匹配。
¥Each request is matched to one (most specific) route handler.
添加路由
¥Adding Routes
你可以使用 H3.on
、H3.[method]
或 H3.all
将路由 handlers 注册到 H3 实例。
¥You can register route handlers to H3 instance using H3.on
, H3.[method]
, or H3.all
.
示例:注册一个路由,将请求与 HTTP GET 方法的 /hello
端点匹配。
¥Example: Register a route to match requests to the /hello
endpoint with HTTP GET method.
- 使用
H3.[method]
。app.get("/hello", () => "Hello world!");
- 使用
H3.on
。app.on("GET", "/hello", () => "Hello world!");
你可以使用不同的方法为同一路由注册多个事件处理程序:
¥You can register multiple event handlers for the same route with different methods:
app
.get("/hello", () => "GET Hello world!")
.post("/hello", () => "POST Hello world!")
.any("/hello", () => "Any other method!");
你还可以使用 H3.all
方法注册一个接受任何 HTTP 方法的路由:
¥You can also use H3.all
method to register a route accepting any HTTP method:
app.all("/hello", (event) => `This is a ${event.req.method} request!`);
动态路由
¥Dynamic Routes
你可以使用 :
前缀定义动态路由参数:
¥You can define dynamic route parameters using :
prefix:
// [GET] /hello/Bob => "Hello, Bob!"
app.get("/hello/:name", (event) => {
return `Hello, ${event.context.params.name}!`;
});
除了命名参数外,你还可以使用 *
作为未命名的可选参数:
¥Instead of named parameters, you can use *
for unnamed optional parameters:
app.get("/hello/*", (event) => `Hello!`);
通配符路由
¥Wildcard Routes
添加 /hello/:name
路由将匹配 /hello/world
或 /hello/123
。但它与 /hello/foo/bar
不匹配。当你需要匹配多层级子路由时,可以使用 **
前缀:
¥Adding /hello/:name
route will match /hello/world
or /hello/123
. But it will not match /hello/foo/bar
.
When you need to match multiple levels of sub routes, you can use **
prefix:
app.get("/hello/**", (event) => `Hello ${event.context.params._}!`);
这将匹配 /hello
、/hello/world
、/hello/123
、/hello/world/123
等。
¥This will match /hello
, /hello/world
, /hello/123
, /hello/world/123
, etc.
_
将把完整的通配符内容存储为单个字符串。¥!NOTE
Param _
will store the full wildcard content as a single string.路由元数据
¥Route Meta
你可以在注册可选路由元数据时定义它们,并从任何中间件访问它们。
¥You can define optional route meta when registering them, accessible from any middleware.
import { H3 } from "h3";
const app = new H3();
app.use((event) => {
console.log(event.context.matchedRoute?.meta); // { auth: true }
});
app.get("/", (event) => "Hi!", { meta: { auth: true } });