H3 工具函数总览
H3 的定位是「组合式框架」:它不给你一个大而全的核心,而是给你一个极小的 H3 实例,剩下的能力全部是一个个独立函数,用到哪个 import 哪个。这意味着两件事——打包体积由你的 import 决定,以及你需要先知道「哪个函数管哪件事」。
这一节是第 6 章的导航:先讲命名规律,再给分区索引和「我要做什么 → 用哪个」的速查表。后面九节按类别展开。
一条贯穿全部工具的命名规律
看名字就知道函数干什么、会不会抛错、返回什么。这是 H3 工具集最省学习成本的地方:
| 前缀 | 语义 | 典型例子 |
|---|---|---|
get* |
读出来,拿不到就给默认值或 undefined,不抛错 |
getCookie、getQuery、getRequestIP |
read* |
读并解析,失败抛错 | readBody、readValidatedBody |
require* |
断言「必须有」,不满足抛 4xx | requireContentType、requireBasicAuth |
assert* |
断言条件成立,不成立抛 4xx | assertMethod、assertBodySize |
is* |
布尔判断,永远不抛错 | isMethod、isEvent、isPreflightRequest |
set* / delete* |
直接改响应的某个部件 | setCookie、setResponseStatus |
append* |
往已有头上追加,而不是覆盖 | appendCorsHeaders、appendAcceptQuery |
handle* |
处理完可能直接短路请求,靠返回值判断 | handleCors、handleCacheHeaders |
with* / define* |
返回一个新的 handler 或包装器 | withBase、defineWebSocketHandler |
proxy* / serve* |
直接把响应发出去 | proxy、serveStatic |
记这一条的实际收益是:看到 getRouterParams 就知道它不会因为参数缺失抛错,看到 requireContentType 就知道它可能抛 415,写 try/catch 时不用翻文档。
八个分区
| 分区 | 解决什么问题 | 本教程章节 |
|---|---|---|
| 请求体与查询 | 读 body、校验、QUERY 方法 | 6.2 |
| 请求信息与缓存 | 取 IP / Host / 协议 / 路由参数 / 条件缓存 | 6.3 |
| 响应构造 | 重定向、空响应、流式、静态资源、清理回调 | 6.4 |
| Cookie | 读写、分块、批量校验 | 6.5 |
| 安全 | Basic 认证、会话、CORS、路径规范化 | 6.6 |
| 代理 | 转发请求、内部子请求 | 6.7 |
| MCP | JSON-RPC 2.0 over HTTP 与 WebSocket | 6.8 |
| 其他与适配器 | withBase、mockEvent、Node/Web 适配 |
6.9 |
「我要做什么」速查表
这张表按意图查,比按字母翻文档快:
| 我想…… | 用 |
|---|---|
| 读 JSON 请求体并校验 | readValidatedBody(6.2) |
| 限制请求体大小 | bodyLimit(limit) 中间件或 assertBodySize(6.2 / 6.9) |
| 读查询参数 | getQuery;要校验用 getValidatedQuery(6.3) |
读路由里的 :id |
getRouterParam,需要解码加 { decode: true }(6.3) |
| 拿到客户端 IP | getRequestIP(6.3,注意 xForwardedFor 风险) |
| 只要方法不对就 405 | assertMethod(6.3) |
| 做 304 协商缓存 | handleCacheHeaders(6.3) |
| 返回 302 跳转 | redirect / redirectBack(6.4) |
| 返回 204 空响应 | noContent()(6.4) |
| 分块流式输出 | iterable(6.4) |
| 请求结束后清资源 | onDispose(6.4) |
| 读写 Cookie | getCookie / setCookie(6.5) |
| 开 CORS | handleCors,返回值不是 false 就短路(6.6) |
| 加 Basic 认证 | basicAuth 中间件 / requireBasicAuth(6.6) |
| 做会话 | useSession / getSession(6.6) |
| 把请求转给别的服务 | proxyRequest(6.7) |
| 扫描目录对外提供静态文件 | serveStatic(6.4) |
| 在测试里造一个 event | mockEvent(6.9) |
工具函数只做三件事
别看函数多,行为模式只有三类。分清楚,调试会快很多。
第一类:直接改 event.res,返回 undefined。
import { H3, setCookie } from "h3";
const app = new H3().get("/", (event) => {
// setCookie 只往 event.res.headers 追加 Set-Cookie,本身不产生响应
setCookie(event, "session", "abc", { httpOnly: true, path: "/" });
return "ok";
});
第二类:返回一个值,交给你 return。
import { H3, redirect, noContent } from "h3";
const app = new H3()
.get("/old", () => redirect("/new"))
// noContent 返回的是一个空响应对象,必须 return 出去
.get("/ping", () => noContent(204));
第三类:可能短路整个请求,靠返回值判断。
import { H3, handleCors } from "h3";
const app = new H3().all("/", (event) => {
const res = handleCors(event, { origin: "*" });
// 不是 false 说明已经处理完(比如预检返回了 204),直接返回
if (res !== false) {
return res;
}
return "ok";
});
第三类最容易写错:以为 handleCors 是「加个头就完事」,其实它在预检请求上会直接把响应做完。这个契约在 6.6 会展开。
💡 官方文档这几页的正文是从源码注释自动生成的,只列了签名和简短说明。本教程在每节里补了「什么时候该用、什么情况会踩坑」,但签名细节以源码为准——尤其是
opts里的可选项,文档不一定列全。
延伸阅读
- 请求体、查询参数与 QUERY 方法:见 6.2 请求体与查询参数
- 条件缓存与请求信息读取:见 6.3 条件缓存与更多请求工具
- 响应构造、静态资源与清理回调:见 6.4 响应工具

TRAE-AI编程


更多建议: