# H3Event
> H3Event,承载传入的请求、已准备的响应和上下文。
每个 HTTP 请求,H3 会在内部创建一个 `H3Event` 对象,并将其传递给事件处理程序,直到发送响应。
事件会经过所有的生命周期钩子和可组合工具,用作上下文。
**示例:**
```js
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 解析前不应该关闭。
```js [app.mjs]
import { logRequest } from "./tracing.mjs";
app.get("/", (event) => {
request.waitUntil(logRequest(request));
return "OK";
});
```
```js [tracing.mjs]
export async function logRequest(request) {
await fetch("https://telemetry.example.com", {
method: "POST",
body: JSON.stringify({
method: request.method,
url: request.url,
ip: request.ip,
}),
});
}
```
## `H3Event` 属性
### `H3Event.app?`
Access to the H3 [application instance](/guide/api/h3).
### `H3Event.context`
上下文是一个包含关于请求的任意信息的对象。
你可以将自定义属性存储在 `event.context` 中,以便在各种工具间共享。
**已知上下文键:**
- `context.params`:匹配的路由参数。
- `middlewareParams`:匹配的中间件参数。
- `matchedRoute`:匹配的路由对象。
- `sessions`:缓存的会话数据。
- `basicAuth`:基本认证数据。
### `H3Event.req`
基于原生的 [Web Request](https://developer.mozilla.org/en-US/docs/Web/API/Request) 的传入 HTTP 请求信息,并包含额外的运行时扩展(参见 [srvx 文档](https://srvx.h3.dev/guide/handler#extended-request-context))。
```ts
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](https://developer.mozilla.org/en-US/docs/Web/API/URL)。
### `H3Event.res`
已准备的 HTTP 响应状态和头信息。
```ts
app.get("/", (event) => {
event.res.status = 200;
event.res.statusText = "OK";
event.res.headers.set("x-test", "works");
return "OK";
});
```