# 响应 > H3 响应实用工具。 ## 事件流 ### `createEventStream(event, opts?)` 初始化一个 EventStream 实例,用于创建[服务器发送事件 (server sent events)](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events) **示例:** ```ts 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](https://www.rfc-editor.org/rfc/rfc7230#section-3.1.2) ## 静态资源服务 ### `serveStatic(event, options)` 根据请求路径动态提供静态资源。 ## 更多响应实用工具 ### `html(first)` 以 HTML 内容响应。 **示例:** ```ts app.get("/", (event) => html(event, "

Hello, World!

")); ``` ### `iterable(iterable)` 遍历一个数据块源,按顺序发送每个数据块。支持异步操作与数据块的混合发送。 每个数据块必须是字符串或缓冲区。 对于生成器(yield)函数,返回值与 yield 的值处理方式相同。 **示例:** ```ts return iterable(async function* work() { // 打开文档主体 yield "\n

Executing...

    \n"; // 执行工作 ... for (let i = 0; i < 1000; i++) { await delay(1000); // 报告进度 yield `
  1. Completed job #`; yield i; yield `
  2. \n`; } // 关闭报告 return `
`; }) async function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } ``` ### `noContent(status)` 响应一个空负载。
**示例:** ```ts app.get("/", () => noContent()); ``` ### `redirect(location, status, statusText?)` 向客户端发送重定向响应。 它会在响应中添加 `location` 头,默认状态码为 302。 响应体发送一个简单的 HTML 页面,包含 meta 刷新标签,以防客户端忽略响应头时进行重定向。 **示例:** ```ts app.get("/", () => { return redirect("https://example.com"); }); ``` **示例:** ```ts app.get("/", () => { return redirect("https://example.com", 301); // 永久重定向 }); ``` ### `writeEarlyHints(event, hints)` 向客户端写入 `HTTP/1.1 103 Early Hints`。