事件处理器

事件处理器是一个接收 H3Event 并返回响应的函数。

你可以使用 defineHandler 定义带类型的事件处理器。

import { H3, defineHandler } from "h3";

const app = new H3();

const handler = defineHandler((event) => "Response");

app.get("/", handler);
使用 defineHandler 是可选的。 你也可以简单地使用一个接受 H3Event 并返回响应的函数。

回调函数可以是同步的也可以是异步的:

defineHandler(async (event) => "Response");

对象语法

middleware

你可以选择性地注册一些 中间件 来与事件处理器一起运行,以拦截请求、响应或错误。

import { basicAuth } from "h3";

defineHandler({
  middleware: [basicAuth({ password: "test" })],
  handler: (event) => "Hi!",
});
Read more in 响应处理.
Read more in Guide > API > H3event.

meta

你可以定义可选的路由元数据附加到处理器上,并从任何其他中间件中访问它们。

import { H3, defineHandler } from "h3";

const app = new H3();

app.use((event) => {
  console.log(event.context.matchedRoute?.meta); // { tag: "admin" }
});

app.get("/admin/**", defineHandler({
  meta: { tag: "admin" },
  handler: (event) => "Hi!",
})
注册到应用实例时也可以添加路由元数据。

处理器 .fetch

defineHandler 定义的事件处理器,可以作为 Web 处理器使用,甚至不需要使用 H3 类。

const handler = defineHandler(async (event) => `Request: ${event.req.url}`);

const response = await handler.fetch("http://localhost/");
console.log(response, await response.text());

延迟处理器

你可以使用 defineLazyEventHandler 定义延迟事件处理器。这允许你定义一些仅在第一次收到匹配路由请求时执行一次的一次性逻辑。

延迟事件处理器必须返回一个事件处理器。

import { defineLazyEventHandler } from "h3";

defineLazyEventHandler(async () => {
  await initSomething(); // 只会执行一次
  return (event) => {
    return "Response";
  };
});

这对于定义一些一次性逻辑非常有用,比如配置、类初始化、繁重的计算等。

另一个用例是延迟加载路由代码块:

import { H3, defineLazyEventHandler } from "h3";

const app = new H3();

app.all(
  "/route",
  defineLazyEventHandler(() =>
    import("./route.mjs").then((mod) => mod.default),
  ),
);

转换为处理器

有些情况下你可能想将为 Node.js 或其他框架制作的事件处理器或工具转换为 H3。 内置了相应的工具函数来实现此功能。

从 Web 处理器

具有 Request => Response 签名的请求处理器,可以使用 fromWebHandler 工具或 H3.mount 转换成 H3 事件处理器。

import { H3, fromWebHandler } from "h3";

export const app = new H3();

const webHandler = (request) => new Response("👋 Hello!"));

// 使用 fromWebHandler 工具
app.all("/web", fromWebHandler(webHandler));

// 使用简单封装
app.all("/web", event => webHandler(event.req));

// 使用 app.mount
app.mount("/web", webHandler)

从 Node.js 处理器

如果你有一个使用 (req, res) => {} 语法的传统 Node.js 请求处理器,你可以使用 fromNodeHandler 将其转换为 h3 事件处理器。

Node.js 事件处理器只能在 Node.js 服务器运行时执行!
import { H3, fromNodeHandler } from "h3";

// 强制使用 Node.js 兼容(也适用于 Bun 和 Deno)
import { serve } from "h3/node";

export const app = new H3();

const nodeHandler = (req, res) => {
  res.end("Node handlers work!");
};

app.get("/web", fromNodeHandler(nodeHandler));