2013-04-16 7 views

Antwort

12

Mit streamifier können Sie Strings und Puffer in lesbare Streams mit dem neuen Stream API konvertieren.

+0

Dies funktioniert das Beste aus jeder Option wie Stream-Puffer oder diese eine Lösung auf dem Windows Azure Blog. Es ist definitiv der schnellste. – Abadaba

+8

Diese Bibliothek sieht gut aus, aber @ zjonssons Antwort ist fast so einfach zu verwenden, mit dem [zugegebenermaßen leichten, solange npmjs nicht wieder unten ist ...] Vorteil der eingebauten. – natevw

108

Der einfachste Weg ist wahrscheinlich, eine neue PassThrough-Stream-Instanz zu erstellen und einfach Ihre Daten dorthin zu schieben. Wenn Sie es an andere Streams weiterleiten, werden die Daten aus dem ersten Stream abgerufen.

var stream = require('stream'); 

// Initiate the source 
var bufferStream = new stream.PassThrough(); 

// Write your buffer 
bufferStream.end(new Buffer('Test data.')); 

// Pipe it to something else (i.e. stdout) 
bufferStream.pipe(process.stdout) 
+7

Wenn node.js intern nicht verwendet wird, teilt diese Lösung den Puffer nicht in kleinere Abschnitte auf und ist daher möglicherweise für einige Pipe-Ziele nicht ideal. * Aber * wenn Sie schauen, tut auch die Streamifier-Bibliothek nicht die akzeptierte Antwort. Also +1 um es einfach zu halten. – natevw

+2

Ich frage mich, ob die Verwendung von 'var pufferStream = stream.PassThrough();' die Absicht für spätere Leser des Codes jedoch klarer machen könnte? – natevw

+0

Beachten Sie auch, dass wenn Ihr Ziel erwartet, dass der Stream an einem bestimmten Punkt beendet wird, Sie wahrscheinlich 'pufferStream.end()' aufrufen müssen. – natevw

24

Als natevw vorgeschlagen, es ist sogar noch mehr idiomatische ein stream.PassThrough zu verwenden, und end es mit dem Puffer:

var buffer = new Buffer('foo'); 
var bufferStream = new stream.PassThrough(); 
bufferStream.end(buffer); 
bufferStream.pipe(process.stdout); 

Dies ist auch, wie Puffer umgewandelt werden/verrohrt in vinyl-fs.

+1

Warum würden Sie mit dem gesamten Puffer "enden"? Und warum kommt 'end' nach 'pipe' hier – Startec

+3

' end (buffer) 'ist nur' write (buffer) 'und dann' end() '. Ich beende den Stream, weil er nicht mehr benötigt wird. Die Reihenfolge von Ende/Pipe spielt hier keine Rolle, da PassThrough nur dann Daten ausgibt, wenn ein Handler für Datenereignisse vorhanden ist, wie eine Pipe. – morris4

+1

@Startec Das Aufteilen des Puffers bedeutet weniger Overhead. Wenn Ihr Kunde nicht mit großen Stücken umgehen kann, dann bewachen Sie ihn mit etwas, das Stücke teilt. – binki