发送响应
从 事件处理器 返回的值会被 H3 自动转换为 web 的 Response。
示例: 简单事件处理函数。
const handler = defineHandler((event) => ({ hello: "world" }));
H3 会智能转换该处理器为:
const handler = (event) =>
new Response(JSON.stringify({ hello: "world" }), {
headers: {
"content-type": "application/json;charset=UTF-8",
},
});
FastResponse
来优化 Node.js 运行时的性能。如果事件处理器返回一个 Promise 或来源于 async 函数,H3 会等待其完成后再发送响应。
如果抛出错误,H3 会自动用错误处理器进行处理。
准备响应
在主处理器返回响应之前,可以使用 event.res
来准备响应头和状态。
defineHandler((event) => {
event.res.status = 200;
event.res.statusText = "OK";
event.res.headers.set("Content-Type", "text/html");
return "<h1>Hello, World</h1>";
});
响应类型
H3 会智能将 JavaScript 值转换为 web 的 Response。
可序列化为 JSON 的值
返回一个可通过 JSON 序列化的值(对象、数组、数字或 布尔值)时,H3 会使用 JSON.stringify() 进行序列化,并以默认的 application/json
内容类型发送。
示例:
app.get("/", (event) => ({ hello: "world" }));
.toJSON()
属性,可以自定义序列化行为。详情可参考 MDN 文档。字符串
返回字符串时,内容会作为纯文本体发送。
content-type
头,默认类型为 text/plain;charset=UTF-8
。示例: 发送 HTML 响应。
app.get("/", (event) => {
event.res.headers.set("Content-Type", "text/html;charset=UTF-8");
return "<h1>hello world</h1>";
});
你也可以使用 html
工具作为快捷方式。
import { html } from "h3";
app.get("/", (event) => html(event, "<h1>hello world</h1>"));
Response
返回一个 web Response 对象时,直接将其作为最终响应发送。
示例:
app.get(
"/",
(event) =>
new Response("Hello, world!", { headers: { "x-powered-by": "H3" } }),
);
Response
时,之前设置的任何预设头信息将被合并为默认头,且 event.res.{status,statusText}
会被忽略。为性能考虑,建议只在最终 Response
中设置头信息。ReadableStream
或 Readable
返回 ReadableStream
或 Node.js 的 Readable
即以流的形式发送。
ArrayBuffer
、Uint8Array
或 Buffer
发送二进制数据,如 ArrayBuffer、Uint8Array 或 Node.js Buffer 对象。
content-length
头会被自动设置。
Blob
发送 Blob
作为流。
Content-type
和 Content-Length
头会被自动设置。
File
发送 File
作为流。
Content-type
、Content-Length
和 Content-Disposition
头会被自动设置。
特殊类型
以下是响应类型中一些不太常见的可能值。
null
或 undefined
发送一个空响应体。
return
语句,效果等同于 return undefined
。Error
返回一个 Error
实例时,将发送此错误。
throw
异常而非直接返回错误实例,这样可以在任何嵌套工具中正确传播。BigInt
会将 BigInt 类型值转换为字符串后发送。
.toJSON
。详情可参考 MDN 文档。Symbol
或 Function
返回 Symbol 或 Function 的行为不可确定。 当前 H3 会发送类似字符串的未知 Symbol 和 Function 表示,但未来版本可能会改为抛出错误。
以下是 H3 内部已知的部分 Symbol:
Symbol.for("h3.notFound")
:表示未找到路由,将抛出 404 错误。Symbol.for("h3.handled")
:表示请求已被某种方式处理,H3 不再继续(仅 Node.js 环境)。