响应
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
。