H3Event

H3Event,承载传入的请求、已准备的响应和上下文。

每个 HTTP 请求,H3 会在内部创建一个 H3Event 对象,并将其传递给事件处理程序,直到发送响应。

Read more in 请求生命周期.

事件会经过所有的生命周期钩子和可组合工具,用作上下文。

示例:

app.get("/", async (event) => {
  // 记录 HTTP 请求
  console.log(`[${event.req.method}] ${event.req.url}`);

  // 解析的 URL 和查询参数
  const searchParams = event.url.searchParams;

  // 尝试读取请求的 JSON body
  const jsonBody = await event.req.json().catch(() => {});

  return "OK";
});

H3Event 方法

H3Event.waitUntil

告知运行时有一个未完成的操作,在对应的 Promise 解析前不应该关闭。

import { logRequest } from "./tracing.mjs";

app.get("/", (event) => {
  request.waitUntil(logRequest(request));
  return "OK";
});

H3Event 属性

H3Event.context

上下文是一个包含关于请求的任意信息的对象。

你可以将自定义属性存储在 event.context 中,以便在各种工具间共享。

已知上下文键:

  • context.params:匹配的路由参数。
  • middlewareParams:匹配的中间件参数。
  • matchedRoute:匹配的路由对象。
  • sessions:缓存的会话数据。
  • basicAuth:基本认证数据。

H3Event.req

基于原生的 Web Request 的传入 HTTP 请求信息,并包含额外的运行时扩展(参见 srvx 文档)。

app.get("/", async (event) => {
  const url = event.req.url;
  const method = event.req.method;
  const headers = event.req.headers;

  // (注意:请求体只能使用一次,可以用以下任一方法)
  const bodyStream = await event.req.body;
  const textBody = await event.req.text();
  const jsonBody = await event.req.json();
  const formDataBody = await event.req.formData();

  return "OK";
});

H3Event.url

访问完整解析后的请求 URL

H3Event.res

已准备的 HTTP 响应状态和头信息。

app.get("/", (event) => {
  event.res.status = 200;
  event.res.statusText = "OK";
  event.res.headers.set("x-test", "works");

  return "OK";
});
Read more in 准备响应.