127 votes

Conversion d'un tampon en ReadableStream en Node.js

J'ai une bibliothèque qui prend comme entrée un ReadableStream mais mon entrée est juste une image au format base64. Je pourrais convertir les données que j'ai dans un Buffer comme ça :

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

Mais je n'ai aucune idée de la manière de le convertir en un ReadableStream ou convertir le Buffer J'ai obtenu à un ReadableStream .

Y a-t-il un moyen de le faire ?

150voto

arkadyt Points 300

Pour nodejs 10.17.0 et plus :

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

const stream = Readable.from(myBuffer.toString());

84voto

Mr5o1 Points 349

Quelque chose comme ça...

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

Dans le cours général, le flux lisible d'un flux _read La fonction doit collecter les données de la source sous-jacente et push de manière incrémentielle, ce qui permet de ne pas récolter une source énorme en mémoire avant d'en avoir besoin.

Dans ce cas, cependant, vous avez déjà la source en mémoire, donc _read n'est pas nécessaire.

Pousser le tampon entier ne fait que l'envelopper dans l'api du flux lisible.

36voto

Bryan Larsen Points 2630

Tampon de flux de nœuds est manifestement conçu pour être utilisé en test ; l'impossibilité d'éviter un retard en fait un mauvais choix pour une utilisation en production.

Gabriel Llamas suggère streamifier dans cette réponse : Comment envelopper un tampon comme un flux lisible stream2 ?

31voto

vanthome Points 739

Vous pouvez créer un ReadableStream à l'aide de la fonction Tampons de flux de nœuds comme ça :

// 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");

La fréquence ne pouvant être nulle, cela introduira un certain retard.

8voto

Joel Harkes Points 6040

Vous n'avez pas besoin d'ajouter toute une librairie npm pour un seul fichier. Je l'ai refactorisé en typescript :

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

sur la base de Node-streamifier (la meilleure option comme indiqué ci-dessus).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X