Ich hacke ein Knotenprogramm, mit smtp-protocol
dem SMTP-E-Mails erfasst und auf die E-Mail-Daten reagiert werden. Die Bibliothek stellt die E-Mail-Daten als Stream bereit, und ich weiß nicht, wie ich das in eine Zeichenfolge umwandeln soll.
Ich schreibe es gerade, um mit stdout zu arbeiten stream.pipe(process.stdout, { end: false })
, aber wie gesagt, ich brauche stattdessen die Stream-Daten in einer Zeichenfolge, die ich verwenden kann, sobald der Stream beendet ist.
Wie sammle ich alle Daten aus einem Node.js-Stream in einer Zeichenfolge?
javascript
node.js
stream
obrienmd
quelle
quelle
Antworten:
(Diese Antwort stammt aus der Zeit vor Jahren, als es die beste Antwort war. Darunter befindet sich jetzt eine bessere Antwort. Ich habe mit node.js nicht Schritt gehalten und kann diese Antwort nicht löschen, da sie bei dieser Frage als "richtig" markiert ist ". Wenn Sie daran denken, nach unten zu klicken, was soll ich dann tun?)
Der Schlüssel besteht darin, die
data
und -Ereignisseend
eines lesbaren Streams zu verwenden . Hören Sie sich diese Ereignisse an:Wenn Sie das
data
Ereignis erhalten, fügen Sie den neuen Datenblock einem Puffer hinzu, der zum Sammeln der Daten erstellt wurde.Wenn Sie das
end
Ereignis erhalten, konvertieren Sie gegebenenfalls den fertigen Puffer in eine Zeichenfolge. Dann tun Sie, was Sie damit tun müssen.quelle
Eine andere Möglichkeit wäre, den Stream in ein Versprechen umzuwandeln (siehe Beispiel unten) und den aufgelösten Wert mit
then
(oderawait
) einer Variablen zuzuweisen.quelle
SyntaxError: await is only valid in async function
. Was mache ich falsch?streamToString(stream).then(function(response){//Do whatever you want with response});
.toString("utf8")
am Ende, um das Problem eines Dekodierungsfehlers zu vermeiden, wenn ein Chunk in die Mitte eines Multibyte-Zeichens aufgeteilt wird. (2) tatsächliche Fehlerbehandlung; (3) Einfügen des Codes in eine Funktion, damit er wiederverwendet und nicht kopiert werden kann; (4) Verwenden von Versprechungen, damit die Funktionawait
aktiviert werden kann; (5) kleiner Code, der im Gegensatz zu bestimmten npm-Bibliotheken nicht eine Million Abhängigkeiten mit sich bringt; (6) ES6-Syntax und moderne Best Practices.Uncaught TypeError [ERR_INVALID_ARG_TYPE]: The "list[0]" argument must be an instance of Buffer or Uint8Array. Received type string
wenn der Streamstring
stattdessen Chunks erzeugtBuffer
. Die Verwendungchunks.push(Buffer.from(chunk))
sollte mit beidenstring
undBuffer
Chunks funktionieren .Keines der oben genannten hat bei mir funktioniert. Ich musste das Buffer-Objekt verwenden:
quelle
Hoffe das ist nützlicher als die obige Antwort:
Beachten Sie, dass die Verkettung von Zeichenfolgen nicht die effizienteste Methode zum Sammeln der Zeichenfolgenteile ist, sondern der Einfachheit halber verwendet wird (und Ihr Code kümmert sich möglicherweise nicht um die Effizienz).
Dieser Code kann auch zu unvorhersehbaren Fehlern bei Nicht-ASCII-Text führen (es wird davon ausgegangen, dass jedes Zeichen in ein Byte passt), aber das interessiert Sie vielleicht auch nicht.
quelle
join("")
das Array am Ende aufrufen .Normalerweise verwende ich diese einfache Funktion, um einen Stream in einen String umzuwandeln:
Anwendungsbeispiel:
quelle
chunks.push(chunk.toString());
Und noch eine für Streicher, die Versprechen verwenden:
Verwendung:
Entfernen Sie
.toString()
bei Bedarf die zur Verwendung mit Binärdaten zu verwendenden.Update : @AndreiLED hat richtig darauf hingewiesen, dass dies Probleme mit Strings hat. Ich konnte mit der Version des Knotens, die ich habe, keinen Stream zurückgeben, der Zeichenfolgen zurückgibt , aber die API stellt fest, dass dies möglich ist.
quelle
Uncaught TypeError [ERR_INVALID_ARG_TYPE]: The "list[0]" argument must be an instance of Buffer or Uint8Array. Received type string
wenn der Streamstring
stattdessen Chunks erzeugtBuffer
. Die Verwendungchunks.push(Buffer.from(chunk))
sollte mit beidenstring
undBuffer
Chunks funktionieren .In der Dokumentation zu nodejs sollten Sie dies tun - denken Sie immer an eine Zeichenfolge, ohne zu wissen, dass die Codierung nur ein Bündel von Bytes ist:
quelle
Streams haben weder eine einfache
.toString()
Funktion (die ich verstehe) noch so etwas wie eine.toStringAsync(cb)
Funktion (die ich nicht verstehe).Also habe ich meine eigene Hilfsfunktion erstellt:
quelle
Ich hatte mehr Glück damit:
Ich benutze Node
v9.11.1
und dasreadstream
ist die Antwort von einemhttp.get
Rückruf.quelle
Die sauberste Lösung könnte darin bestehen, das Paket "string-stream" zu verwenden, das einen Stream mit einem Versprechen in einen String konvertiert.
quelle
Einfacher Weg mit der beliebten (über 5 Millionen wöchentliche Downloads) und leichten Get-Stream- Bibliothek:
https://www.npmjs.com/package/get-stream
quelle
Was ist mit so etwas wie einem Stromreduzierer?
Hier ist ein Beispiel für die Verwendung von ES6-Klassen.
quelle
Dies hat bei mir funktioniert und basiert auf Node v6.7.0 docs :
quelle
setEncoding ('utf8');
Gut gemacht Sebastian J oben.
Ich hatte das "Pufferproblem" mit ein paar Zeilen Testcode, die ich hatte, und fügte die Codierungsinformationen hinzu und es löste es, siehe unten.
Demonstrieren Sie das Problem
Software
Eingang
Ausgabe
Demonstrieren Sie die Lösung
Software
Eingang
Ausgabe
quelle
Alle aufgelisteten Antworten scheinen den lesbaren Stream im fließenden Modus zu öffnen, was in NodeJS nicht die Standardeinstellung ist und Einschränkungen aufweisen kann, da NodeJS im angehaltenen lesbaren Stream-Modus keine Unterstützung für den Gegendruck bietet. Hier ist eine Implementierung mit Just Buffers, Native Stream und Native Stream Transforms und Unterstützung für den Objektmodus
quelle
Mit dem sehr beliebten
stream-buffers
Paket, das Sie wahrscheinlich bereits in Ihren Projektabhängigkeiten haben, ist dies ziemlich einfach:quelle
In meinem Fall lautete der Inhaltstyp der Antwortheader Inhaltstyp: Text / Klartext . Also habe ich die Daten von Buffer wie folgt gelesen:
quelle