响应

H3 响应实用工具。

事件流

createEventStream(event, opts?)

初始化一个 EventStream 实例,用于创建服务器发送事件 (server sent events)

示例:

import { createEventStream, sendEventStream } from "h3";

app.get("/sse", (event) => {
  const eventStream = createEventStream(event);

  // 每秒发送一条消息
  const interval = setInterval(async () => {
    await eventStream.push("Hello world");
  }, 1000);

  // 当连接终止时清理定时器并关闭流
  eventStream.onClosed(async () => {
    console.log("closing SSE...");
    clearInterval(interval);
    await eventStream.close();
  });

  return eventStream.send();
});

清理

sanitizeStatusCode(statusCode?, defaultStatusCode)

确保状态码是有效的 HTTP 状态码。

sanitizeStatusMessage(statusMessage)

确保状态消息安全可用于响应。

允许的字符:水平制表符、空格或可见 ASCII 字符:https://www.rfc-editor.org/rfc/rfc7230#section-3.1.2

静态资源服务

serveStatic(event, options)

根据请求路径动态提供静态资源。

更多响应实用工具

html(event, content)

以 HTML 内容响应。

示例:

app.get("/", (event) => html(event, "<h1>Hello, World!</h1>"));

iterable(_event, iterable)

遍历一个数据块源,按顺序发送每个数据块。支持异步操作与数据块的混合发送。

每个数据块必须是字符串或缓冲区。

对于生成器(yield)函数,返回值与 yield 的值处理方式相同。

示例:

return iterable(event, async function* work() {
  // 打开文档主体
  yield "<!DOCTYPE html>\n<html><body><h1>Executing...</h1><ol>\n";
  // 执行工作 ...
  for (let i = 0; i < 1000; i++) {
    await delay(1000);
    // 报告进度
    yield `<li>Completed job #`;
    yield i;
    yield `</li>\n`;
  }
  // 关闭报告
  return `</ol></body></html>`;
})
async function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

noContent(event, code?)

响应一个空负载。

示例:

app.get("/", (event) => noContent(event));

redirect(event, location, code)

向客户端发送重定向响应。

它会在响应中添加 location 头,默认状态码为 302。

响应体发送一个简单的 HTML 页面,包含 meta 刷新标签,以防客户端忽略响应头时进行重定向。

示例:

app.get("/", (event) => {
  return redirect(event, "https://example.com");
});

示例:

app.get("/", (event) => {
  return redirect(event, "https://example.com", 301); // 永久重定向
});

writeEarlyHints(event, hints)

向客户端写入 HTTP/1.1 103 Early Hints