Nodejs:传输流没有完全抽出数据?

时间:2014-03-13 16:27:17

标签: node.js stream

我试图通过编写一个小脚本来学习Nodejs中的流媒体。但是在执行完这个之后,最后一个流并没有推送所有数据。

var stream = require('stream');
var fs = require('fs');
var util = require('util');

function Newliner () {
    stream.Transform.call(this);
}
util.inherits(Newliner, stream.Transform);


Newliner.prototype._transform = function(chunk, enc, done)  {
    var split = 0;
    for( var i =0; i <chunk.length; i++){
    if(chunk[i] == 10) {
        this.push(chunk.slice(split,i));
        split = i+1;
    }
    }
}

function Greper(options) {
    stream.Transform.call(this);
    this.regex = new RegExp(options);
}
util.inherits(Greper, stream.Transform);


Greper.prototype._transform = function(chunk, enc, done)  {
    this.push(chunk);  //Even this is not working.
    /*
    var a = chunk.toString();
    if(this.regex.test(a)){ 
    this.push(chunk);
    }
    */
}



var n = new Newliner();
var g = new Greper("line");
var f = fs.createReadStream('a.txt');

f.pipe(n).pipe(g).pipe(process.stdout);

输入文件a.txt是,

This is line one.
Another line.
Third line.

仅显示一行。这是什么原因?

$ node test.js 
This is line one.

注意:当我将文件读取流直接传送到'g'时,它可以正常工作。

1 个答案:

答案 0 :(得分:0)

完成处理块后,需要调用_transform()函数的回调。来自the documentation

  

callback(函数)完成处理提供的块后,调用此函数(可选择使用错误参数)。

在调用回调之前,不会再将数据推送到流中。如果你没有调用它,那么块将不会被视为已处理...这就是为什么你的程序在只处理一行后就停止了。

只需添加:

done();

Newliner.prototype._transformGreper.prototype._transform函数的末尾。