Ich verwende eine Bibliothek, ya-csv , die entweder eine Datei oder einen Stream als Eingabe erwartet, aber ich habe eine Zeichenfolge.
Wie konvertiere ich diese Zeichenfolge in einen Stream in Node?
quelle
Ich verwende eine Bibliothek, ya-csv , die entweder eine Datei oder einen Stream als Eingabe erwartet, aber ich habe eine Zeichenfolge.
Wie konvertiere ich diese Zeichenfolge in einen Stream in Node?
Ab Knoten 10.17 verfügt stream.Readable über eine from
Methode zum einfachen Erstellen von Streams aus beliebigen iterierbaren Elementen (einschließlich Array-Literalen):
const { Readable } = require("stream")
const readable = Readable.from(["input string"])
readable.on("data", (chunk) => {
console.log(chunk) // will be called once with `"input string"`
})
Beachten Sie, dass mindestens zwischen 10.17 und 12.3 eine Zeichenfolge selbst iterierbar ist, also Readable.from("input string")
funktioniert, aber ein Ereignis pro Zeichen ausgibt . Readable.from(["input string"])
gibt ein Ereignis pro Element im Array aus (in diesem Fall ein Element).
Beachten Sie auch, dass in späteren Knoten (wahrscheinlich 12.3, da in der Dokumentation angegeben ist, dass die Funktion damals geändert wurde) die Zeichenfolge nicht mehr in ein Array eingeschlossen werden muss.
https://nodejs.org/api/stream.html#stream_stream_readable_from_iterable_options
Da @substack mich in #node korrigiert hat, erleichtert die neue Streams-API in Node v10 dies:
… Danach können Sie frei pfeifen oder auf andere Weise an Ihren beabsichtigten Verbraucher weitergeben.
Es ist nicht so sauber wie der Resumer - Einzeiler , aber es vermeidet die zusätzliche Abhängigkeit.
( Update: In Version 0.10.26 bis Version 9.2.1 stürzt ein Aufruf
push
direkt von der REPL-Eingabeaufforderung mit einernot implemented
Ausnahme ab, wenn Sie ihn nicht festgelegt haben_read
. Er stürzt nicht in einer Funktion oder einem Skript ab. Wenn Sie inkonsistent sind nervös, gehören dienoop
.)quelle
_read
Methode zum Abrufen von Daten aus der zugrunde liegenden Ressource bereitstellen ."null
in den Puffer des Streams?null
teilt dem Stream mit, dass er alle Daten gelesen und den Stream geschlossen hatreadable.push()
Methode soll nur von lesbaren Implementierern und nur innerhalb derreadable._read()
Methode aufgerufen werden."Verwenden Sie nicht die Antwort von Jo Liss. Es wird in den meisten Fällen funktionieren, aber in meinem Fall hat es mir gute 4 oder 5 Stunden Fehlersuche verloren. Hierfür sind keine Module von Drittanbietern erforderlich.
NEUE ANTWORT :
Dies sollte ein vollständig kompatibler lesbarer Stream sein. Sehen Sie hier für weitere Informationen auf , wie man richtig Ströme verwenden.
ALTE ANTWORT : Verwenden Sie einfach den nativen PassThrough-Stream:
Beachten Sie, dass das Ereignis 'close' nicht ausgegeben wird (was von den Stream-Schnittstellen nicht benötigt wird).
quelle
Erstellen Sie einfach eine neue Instanz des
stream
Moduls und passen Sie sie Ihren Anforderungen an:oder
quelle
pipe()
soll zumindest den Zielstrom zurückgeben.Edit: Garths Antwort ist wahrscheinlich besser.
Mein alter Antworttext bleibt unten erhalten.
Um einen String in einen Stream zu konvertieren, können Sie eine Pause durch Strom:
Beispiel:
quelle
resumer
recht gut. Vielen Dank!Dafür gibt es ein Modul: https://www.npmjs.com/package/string-to-stream
quelle
im Kaffeeskript:
benutze es:
quelle
Eine andere Lösung besteht darin, die Lesefunktion an den Konstruktor von Readable zu übergeben (siehe lesbare Optionen für den Doc- Stream ).
Sie können nach der Verwendung an Rohr zum Beispiel
quelle
Ich hatte es satt, dies alle sechs Monate neu lernen zu müssen, und habe gerade ein npm-Modul veröffentlicht, um die Implementierungsdetails zu abstrahieren:
https://www.npmjs.com/package/streamify-string
Dies ist der Kern des Moduls:
str
ist dasstring
, was beim Aufruf an den Konstruktor übergeben werden muss und vom Stream als Daten ausgegeben wird.options
sind die typischen Optionen, die gemäß der Dokumentation an einen Stream übergeben werden können .Laut Travis CI sollte es mit den meisten Versionen von Node kompatibel sein.
quelle
Hier ist eine ordentliche Lösung in TypeScript:
quelle
JavaScript ist vom Typ Ente. Wenn Sie also nur die API eines lesbaren Streams kopieren , funktioniert dies einwandfrei. In der Tat können Sie wahrscheinlich die meisten dieser Methoden nicht implementieren oder sie einfach als Stubs belassen. Alles, was Sie implementieren müssen, ist das, was die Bibliothek verwendet. Sie können die vorgefertigte
EventEmitter
Klasse von Node auch zum Behandeln von Ereignissen verwenden, sodass Sie dies nicht selbst implementieren müssenaddListener
.So können Sie es in CoffeeScript implementieren:
Dann könnten Sie es so verwenden:
quelle
TypeError: string is not a function at String.CALL_NON_FUNCTION (native)
new StringStream(str).send()
stream.Readable
wie von @Garth Kidd vorgeschlagen.stream.Readable
existierte nicht, als ich diese Antwort schrieb.