将缓冲区转换为node.js中的readableStream



我有一个库,它以 ReadableStream的输入为输入,但我的输入只是base64格式映像。我可以将我在Buffer中的数据转换为:

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

,但我不知道如何将其转换为ReadableStream或将Buffer转换为ReadableStream

有没有办法做到这一点?

nodejs 10.17.0及以上:

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

类似的东西...

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中。

节点流缓冲区显然是设计用于测试的;无法避免延迟使其成为生产使用的糟糕选择。

Gabriel Llamas在此答案中建议流媒体:如何将缓冲区包裹为流式的流?

您可以使用节点流缓冲区这样创建一个ReadAbleSream:

// 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,因此这将引入一定的延迟。

您可以使用标准nodejs stream api为此 - stream.predable.from

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

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

您无需为一个文件添加整个NPM lib。我将其重构为打字稿:

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;
  };
}

基于节点流程仪(如上所述的最佳选项)。

这是一个使用 streamifier 模块的简单解决方案。

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

您可以将字符串,缓冲区和对象用作其参数。

这是我的简单代码。

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;
}

来源:Brian Mancini-> http://derpturkey.com/buffer-to-stream-in-node/

相关内容

  • 没有找到相关文章