如何从服务器流式传输异步字符串
How to stream asynchronous string from server
我正在尝试在 Deno 中流式传输 html
响应,但不太明白。
从前端的 Service Worker 执行它看起来像这样:
async function streamResponse(html: {start: (s: string) => Promise<void>}) {
const encoder = new TextEncoder()
const stream = new ReadableStream({
async start(controller : ReadableStreamDefaultController<any>) {
const send = (item: string) => controller.enqueue(encoder.encode(item))
await html.start(send)
controller.close()
}
})
return new Response(stream, { headers: { "content-type": "text/html; charset=utf-8" }})
}
当我在 Deno
(req.respond({body: stream, headers})
) 中做类似的事情时,它说正文不能是 ReadableStream
类型。我知道有一些方法可以做到这一点。我只是想不通。我错过了什么?我查看了多个地方试图了解它是如何完成的,但我还没有找到任何好的例子。
想通了。我需要使用Deno.Buffer
作为编写器,然后引入BufReader
来包装编写器。
import { BufReader } from "https://deno.land/std@0.79.0/io/bufio.ts"
import { ServerRequest } from "https://deno.land/std@0.79.0/http/server.ts"
import { HTML } from "./html.ts"
var headers = new Headers({
"Content-Type": "text/html"
})
const encoder = new TextEncoder()
export async function toHTML(req: ServerRequest, html: Promise<HTML>) {
var buffer = new Deno.Buffer()
var body = new BufReader(buffer)
var h = await html
req.respond({body, headers})
await h.start((item: string) => buffer.write(encoder.encode(item)))
}
我正在尝试在 Deno 中流式传输 html
响应,但不太明白。
从前端的 Service Worker 执行它看起来像这样:
async function streamResponse(html: {start: (s: string) => Promise<void>}) {
const encoder = new TextEncoder()
const stream = new ReadableStream({
async start(controller : ReadableStreamDefaultController<any>) {
const send = (item: string) => controller.enqueue(encoder.encode(item))
await html.start(send)
controller.close()
}
})
return new Response(stream, { headers: { "content-type": "text/html; charset=utf-8" }})
}
当我在 Deno
(req.respond({body: stream, headers})
) 中做类似的事情时,它说正文不能是 ReadableStream
类型。我知道有一些方法可以做到这一点。我只是想不通。我错过了什么?我查看了多个地方试图了解它是如何完成的,但我还没有找到任何好的例子。
想通了。我需要使用Deno.Buffer
作为编写器,然后引入BufReader
来包装编写器。
import { BufReader } from "https://deno.land/std@0.79.0/io/bufio.ts"
import { ServerRequest } from "https://deno.land/std@0.79.0/http/server.ts"
import { HTML } from "./html.ts"
var headers = new Headers({
"Content-Type": "text/html"
})
const encoder = new TextEncoder()
export async function toHTML(req: ServerRequest, html: Promise<HTML>) {
var buffer = new Deno.Buffer()
var body = new BufReader(buffer)
var h = await html
req.respond({body, headers})
await h.start((item: string) => buffer.write(encoder.encode(item)))
}