2016-03-20 8 views
0

Zugriff auf I (idealerweise eine Datei lesen wollen mit fs.createReadStream, Rohr es einen Prozess verwandeln durch und es dann (im Idealfall auf eine andere Datei.Strom-Transformation, interne Daten

mit fs.createWriteStream schreiben) I ein Strom umwandeln bin mit (new stream.Transform()) für diesen, und es scheint, zu arbeiten, außer jetzt ich stecken bin

in der Flush-Methode des Stroms verwandelt ich habe

strm._flush = function (done) { 
     if (this._lastLineData) { 
      this.push(this._lastLineData + '\n'); 
     } 
     this._lastLineData = null; 
     done(); 
    }; 

ich mag einige Daten in den internen Daten zu ändern, um die Lage sein, s tructure, wo die Transformation die Daten speichert. Wie kann ich auf diese interne Datenstruktur zugreifen?

Mit anderen Worten, this.push ist sicherlich auf einige Array, Ich möchte in der _flush-Methode aus bestimmten Elementen dieses Arrays lesen können.

Dropping in den Knoten Kern, sehe ich:

Transform.prototype.push = function(chunk, encoding) { 
    this._transformState.needTransform = false; 
    return Duplex.prototype.push.call(this, chunk, encoding); 
}; 

und

Readable.prototype.push = function(chunk, encoding) { 
    var state = this._readableState; 

    if (!state.objectMode && typeof chunk === 'string') { 
    encoding = encoding || state.defaultEncoding; 
    if (encoding !== state.encoding) { 
     chunk = new Buffer(chunk, encoding); 
     encoding = ''; 
    } 
    } 

    return readableAddChunk(this, state, chunk, encoding, false); 
}; 

und

function readableAddChunk(stream, state, chunk, encoding, addToFront) { 
    var er = chunkInvalid(state, chunk); 
    if (er) { 
    stream.emit('error', er); 
    } else if (chunk === null) { 
    state.reading = false; 
    onEofChunk(stream, state); 
    } else if (state.objectMode || chunk && chunk.length > 0) { 
    if (state.ended && !addToFront) { 
     var e = new Error('stream.push() after EOF'); 
     stream.emit('error', e); 
    } else if (state.endEmitted && addToFront) { 
     var e = new Error('stream.unshift() after end event'); 
     stream.emit('error', e); 
    } else { 
     if (state.decoder && !addToFront && !encoding) 
     chunk = state.decoder.write(chunk); 

     if (!addToFront) 
     state.reading = false; 

     // if we want the data now, just emit it. 
     if (state.flowing && state.length === 0 && !state.sync) { 
     stream.emit('data', chunk); 
     stream.read(0); 
     } else { 
     // update the buffer info. 
     state.length += state.objectMode ? 1 : chunk.length; 
     if (addToFront) 
      state.buffer.unshift(chunk); 
     else 
      state.buffer.push(chunk); 

     if (state.needReadable) 
      emitReadable(stream); 
     } 

     maybeReadMore(stream, state); 
    } 
    } else if (!addToFront) { 
    state.reading = false; 
    } 

    return needMoreData(state); 
} 

so scheint es mir, gibt es keine einfache Möglichkeit, auf die bekommen interne Daten?

Antwort

0

Sie können das nicht tun.

Welche Ströme sollten für Rohr Daten von einem Ort zum anderen verwendet werden. Wenn Sie die gesamten Daten ändern möchten (bevor Sie sie zum nächsten Stream leiten), sollten Sie überhaupt keinen Stream verwenden. Denken Sie an sie als endlosen Datenstrom.

Was können Sie tun, ist:

var data = []; 

stream._transform = function(chunk, enc, done) { 
    data.push(chunk); 
    done(chunk); 
} 

stream._flush = function(done) { 
    /** ... Do something with data ... */ 
    data = []; // Null data variable, to allow GC collecting it. 
    done(); 
};