将 String 映射到 Node 中的 ReadableStream<Uint8Array>

Map String to ReadableStream<Uint8Array> in Node

我需要从 string(或 ArrayBuffer,如果这样更容易)映射到 ReadableStream<Uint8Array>。这是在 NodeJS 环境中。这是怎么做到的?我所做的大多数挖掘显示如下:

import { Readable } from "stream";

Readable.from("foo");

但是Readable.fromreturns一个Readable,我需要一个ReadableStream<Uint8Array>.

我希望能够做类似的事情:

const stream = ReadableStream.from("foo");

好吧,由于我是 node.js 的新手,我会尽力回答这个问题。但不能保证它是专业的或完美的。请随时编辑此问题。

要创建可读流,我们需要从流模块导入可读 Class。然后我们创建一个可读流对象。 Readable Class' 构造函数需要一个包含“读取”方法的对象。

因此,每当另一个流从我们的可读流中读取时,它都会调用此 read() 方法。如果我们有任何可用数据,那么我们需要使用“this.push()”方法推送它,该方法已由 Readable class.

提供

如果我们没有更多的数据,那么我们需要按下“null”来表示数据事件的“结束”。

现在要将字符串转换为 Uint8Array,我先将其转换为 Buffer,然后将该 Buffer 转换为 Uint8Array(如您所说,您需要 Uint8Array)。但我不确定这样做是否有效或值得推荐。

无论如何,这里我取了一个字符串,一个字符一个字符地读取它,以模拟我们正在为一个大文件提供服务的场景。因为不想把一个大文件完全缓冲在内存上。

完成所有这些之后,我将这个可读流通过管道传输到 process.stdout,这是一个可写流。您可以在下一个终端中看到输出。为什么将其转换为字符串而不是 Uint8Array。因为 process.stdout 可能有默认编码“utf8”,或者它在将数据写入控制台之前将其转换为字符串。

事实证明如果你使用 Blob:

就很简单了

const readableStream: ReadableStream<Uint8Array> = new Blob(["foo"]).stream();