Ich bin ziemlich neu in Buffers und ReadableStreams, also ist das vielleicht eine dumme Frage. Ich habe eine Bibliothek, die als Eingabe a verwendet ReadableStream
, aber meine Eingabe ist nur ein Bild im Base64-Format. Ich könnte die Daten, die ich habe, Buffer
so konvertieren :
var img = new Buffer(img_string, 'base64');
Aber ich habe keine Ahnung, wie ich es in ein ReadableStream
konvertieren oder das, was Buffer
ich erhalten habe, in ein konvertieren soll ReadableStream
.
Gibt es eine Möglichkeit, dies zu tun, oder versuche ich, das Unmögliche zu erreichen?
Vielen Dank.
javascript
node.js
stream
buffer
Masiar
quelle
quelle
etwas wie das...
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
Im Allgemeinen
_read
sollte die Funktion eines lesbaren Streams Daten von der zugrunde liegenden Quelle erfassen undpush
schrittweise sicherstellen, dass Sie keine große Quelle in den Speicher einspeisen, bevor sie benötigt wird.In diesem Fall ist die Quelle zwar bereits im Speicher, dies
_read
ist jedoch nicht erforderlich.Durch Drücken des gesamten Puffers wird dieser einfach in die lesbare Stream-API eingeschlossen.
quelle
push()
den Puffer innerhalb der_read()
Methode? Dhreadable._read = () => {readable.push(buffer); readable.push(null);}
. Ich bin mir nicht sicher, ob es wichtig ist, aber es scheint weniger wahrscheinlich zu sein, dass der Stream das Timing der Dateneingabe verwaltet. Davon abgesehen sollte dies die akzeptierte Antwort sein, da sie nicht auf Modulen von Drittanbietern basiert.push
derread
Methode befassen. Konzeptionell denke ich,_read
sollte für das "Ernten" von Daten aus einer zugrunde liegenden Quelle reserviert werden. In diesem Fall haben wir nicht nur die Daten im Speicher, sondern es ist auch keine Konvertierung erforderlich. Um Daten in einen Stream zu verpacken, würde ich das so machen, aber um Daten in einen Stream zu konvertieren oder zu akkumulieren, würde diese Logik in der_read
Methode passieren .Der Node Stream Buffer wurde offensichtlich für Testzwecke entwickelt. Die Unfähigkeit, eine Verzögerung zu vermeiden, macht es zu einer schlechten Wahl für den Produktionseinsatz.
Gabriel Llamas schlägt streamifier in dieser Antwort: Wie man einen Puffer als stream2 Lesbare Strom wickeln?
quelle
Für Knoten 10.17.0 und höher:
const stream = Readable.from(myBuffer.toString());
quelle
Hier ist eine einfache Lösung mit dem Streamifier- Modul.
const streamifier = require('streamifier'); streamifier.createReadStream(new Buffer ([97, 98, 99])).pipe(process.stdout);
Sie können Strings, Buffer und Object als Argumente verwenden.
quelle
const toStream = require('tostream'); toStream(new Buffer ([97, 98, 99])).pipe(process.stdout);
Sie müssen nicht eine ganze npm lib für eine einzelne Datei hinzufügen. Ich habe es in Typoskript umgestaltet:
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; }; }
basierend auf Node-Streamifier (die beste Option wie oben erwähnt).
quelle
Dies ist mein einfacher Code dafür.
import { Readable } from 'stream'; const newStream = new Readable({ read() { this.push(someBuffer); }, })
quelle
Versuche dies:
const Duplex = require('stream').Duplex; // core NodeJS API function bufferToStream(buffer) { let stream = new Duplex(); stream.push(buffer); stream.push(null); return stream; }
Quelle: Brian Mancini -> http://derpturkey.com/buffer-to-stream-in-node/
quelle