发送响应

H3 会自动将任何返回值转换为 web 响应。

事件处理器 返回的值会被 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",
    },
  });
🚀 H3 内部使用 srvx 的 FastResponse 来优化 Node.js 运行时的性能。

如果事件处理器返回一个 Promise 或来源于 async 函数,H3 会等待其完成后再发送响应。

如果抛出错误,H3 会自动用错误处理器进行处理。

Read more in 错误处理.

准备响应

在主处理器返回响应之前,可以使用 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>";
});
如果直接返回完整的 Response 对象,预设的状态将被丢弃,且响应头会被合并/覆盖。出于性能考虑,建议此时只在最终 Response 中设置头信息。
若发生错误,预设的状态和头信息将被丢弃。

响应类型

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 中设置头信息。

ReadableStreamReadable

返回 ReadableStream 或 Node.js 的 Readable 即以流的形式发送。

ArrayBufferUint8ArrayBuffer

发送二进制数据,如 ArrayBufferUint8Array 或 Node.js Buffer 对象。

content-length 头会被自动设置。

Blob

发送 Blob 作为流。

Content-typeContent-Length 头会被自动设置。

File

发送 File 作为流。

Content-typeContent-LengthContent-Disposition 头会被自动设置。

特殊类型

以下是响应类型中一些不太常见的可能值。

nullundefined

发送一个空响应体。

如果事件处理器中没有使用 return 语句,效果等同于 return undefined

Error

返回一个 Error 实例时,将发送此错误。

建议 throw 异常而非直接返回错误实例,这样可以在任何嵌套工具中正确传播。
Read more in 错误处理.

BigInt

会将 BigInt 类型值转换为字符串后发送。

返回 JSON 对象时不支持 BigInt 序列化,你需要自己实现 .toJSON。详情可参考 MDN 文档

SymbolFunction

返回 Symbol 或 Function 的行为不可确定。 当前 H3 会发送类似字符串的未知 Symbol 和 Function 表示,但未来版本可能会改为抛出错误。

以下是 H3 内部已知的部分 Symbol:

  • Symbol.for("h3.notFound"):表示未找到路由,将抛出 404 错误。
  • Symbol.for("h3.handled"):表示请求已被某种方式处理,H3 不再继续(仅 Node.js 环境)。