【问题标题】:How to stream asynchronous string from server如何从服务器流式传输异步字符串
【发布时间】:2020-12-10 11:57:20
【问题描述】:

我正在尝试在 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


    【解决方案1】:

    想通了。我需要使用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)))
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 2014-06-06
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多