2013-12-20 8 views
8

Ich versuche Streams zu lernen und habe ein kleines Problem, damit es richtig funktioniert.Wie implementiere ich einen grundlegenden Knoten Stream.Readable Beispiel?

In diesem Beispiel möchte ich einfach ein statisches Objekt in den Stream schieben und dieses an meine Serverantwort leiten.

Hier ist, was ich bisher habe, aber eine Menge davon funktioniert nicht. Wenn ich den Stream auch nur an die Konsole ausgeben könnte, kann ich herausfinden, wie er ihn an meine Antwort weiterleitet.

var Readable = require('stream').Readable; 

var MyStream = function(options) { 
    Readable.call(this); 
}; 

MyStream.prototype._read = function(n) { 
    this.push(chunk); 
}; 

var stream = new MyStream({objectMode: true}); 
s.push({test: true}); 

request.reply(s); 

Antwort

8

Es gibt ein paar Probleme mit Ihrem aktuellen Code.

  1. Der Anforderungsstream ist höchstwahrscheinlich ein Stream im Puffermodus: Dies bedeutet, dass Sie keine Objekte in ihn schreiben können. Glücklicherweise werden die Optionen nicht an den Readable-Konstruktor übergeben, sodass Ihr Fehler keine Probleme verursacht, aber semantisch ist dies falsch und führt nicht zu den erwarteten Ergebnissen.
  2. Sie rufen den Konstruktor Readable, aber nicht die Prototypeigenschaften erben. Sie sollten util.inherits() zur Unterklasse Readable verwenden.
  3. Die chunk Variable ist nirgendwo in Ihrem Codebeispiel definiert.

Hier ist ein funktionierendes Beispiel:

var util = require('util'); 
var Readable = require('stream').Readable; 

var MyStream = function(options) { 
    Readable.call(this, options); // pass through the options to the Readable constructor 
    this.counter = 1000; 
}; 

util.inherits(MyStream, Readable); // inherit the prototype methods 

MyStream.prototype._read = function(n) { 
    this.push('foobar'); 
    if (this.counter-- === 0) { // stop the stream 
    this.push(null); 
    } 
}; 

var mystream = new MyStream(); 
mystream.pipe(process.stdout); 
+0

Ich bin verwirrt darüber, wie Sachen in den Stream zu schieben. Ich sehe, du schiebst Foobar, aber ich muss Sachen in die Mystream-Instanz schieben. Wie mache ich das? – doremi

+0

Haben Sie den Code ausgeführt? Der Funktionsaufruf 'this.push()' bedeutet, dass * die Daten in die Lesewarteschlange * geschoben werden. Das bedeutet, dass alles, was Sie pushen, für die Konsumenten des Streams verfügbar ist (hier ist das der Stream "process.stdout"). –

+2

Sie sollten auch das [Stream-Handbuch] (https://github.com/substack/stream-handbook) lesen, insbesondere den Abschnitt * Erstellen eines lesbaren Streams *. –

Verwandte Themen