在 Node.js 中将 Buffer 转换为 ReadableStream

我有一个采用 ReadableStream作为输入的库,但是我的输入只是一个 base64格式的图像。我可以像这样转换 Buffer中的数据:

var img = new Buffer(img_string, 'base64');

但是我不知道如何将它转换成 ReadableStream或者将我获得的 Buffer转换成 ReadableStream

有办法吗?

168683 次浏览

您可以像下面这样使用 节点流缓冲区创建 ReadableStream:

// Initialize stream
var myReadableStreamBuffer = new streamBuffers.ReadableStreamBuffer({
frequency: 10,      // in milliseconds.
chunkSize: 2048     // in bytes.
});


// With a buffer
myReadableStreamBuffer.put(aBuffer);


// Or with a string
myReadableStreamBuffer.put("A String", "utf8");

频率不能为0,因此这将引入一定的延迟。

Node Stream Buffer 显然是为测试而设计的; 无法避免延迟使其成为生产使用的糟糕选择。

Gabriel Llamas 在这个问题的答案中建议 流化机: 如何把缓冲区包装成一个可读的流?

像这样的东西。

import { Readable } from 'stream'


const buffer = new Buffer(img_string, 'base64')
const readable = new Readable()
readable._read = () => {} // _read is required but you can noop it
readable.push(buffer)
readable.push(null)


readable.pipe(consumer) // consume the stream

在一般过程中,可读流的 _read函数应该从底层数据源收集数据,并且 push函数应该增量地确保在需要之前不会将大量数据源收集到内存中。

在这种情况下,虽然内存中已经有了源,但是不需要 _read

推动整个缓冲区只是将它包装在可读的流 api 中。

下面是一个使用 一个 href = “ https://github.com/gagle/node-Streifier”rel = “ nofollow norefrer”> Streifier 模块的简单解决方案。

const streamifier = require('streamifier');
streamifier.createReadStream(new Buffer ([97, 98, 99])).pipe(process.stdout);

可以使用字符串、缓冲区和对象作为其参数。

你不需要为一个文件添加一个完整的 npm 库:

import { Readable, ReadableOptions } from "stream";


export class MultiStream extends Readable {
_object: any;
constructor(object: any, options: ReadableOptions) {
super(object instanceof Buffer || typeof object === "string" ? options : { objectMode: true });
this._object = object;
}
_read = () => {
this.push(this._object);
this._object = null;
};
}

基于 节点简化器(上述最佳选择)。

这是我的简单代码。

import { Readable } from 'stream';


const newStream = new Readable({
read() {
this.push(someBuffer);
},
})

试试这个:

const Duplex = require('stream').Duplex;  // core NodeJS API
function bufferToStream(buffer) {
let stream = new Duplex();
stream.push(buffer);
stream.push(null);
return stream;
}

来源: 布莱恩曼奇尼-> < a href = “ http://derpturkey.com/buffer-to-stream-in-node/”rel = “ nofollow norefrer”> http://derpturkey.com/buffer-to-stream-in-node/

对于 nodejs 10.17.0及以上版本:

const { Readable } = require('stream');


const stream = Readable.from(myBuffer);

您可以为此使用标准的 NodeJS 流 API-流,可读,来自

const { Readable } = require('stream');
const stream = Readable.from(buffer);

注意: 如果缓冲区包含二进制数据,则不要将缓冲区转换为字符串(buffer.toString())。它将导致损坏的二进制文件。