节点js .10 fs.createReadStream streams2结束事件未触发

时间:2014-04-22 00:28:42

标签: javascript node.js stream fs

我使用Node.js v0.10.26,并尝试使用新的stream2 apis http://blog.nodejs.org/2012/12/20/streams2/, 特别是Readable api,http://nodejs.org/api/stream.html#stream_class_stream_readable

但是'结束'事件永远不会被调用,我无法弄清楚原因。我认为为什么我的下游变换流组件不会调用他们的_flush,完成,关闭事件,

var rqt = fs.createReadStream('some.csv.gz');

//readable
rqt.on('readable',  function () { console.log('readable!');  })
    .on('data',  function (data) { console.log('Data!', data);  })
    .on('error', function (err)  { console.error('Error', err);/* READ if there was an error receiving data. */ })
    .on('end',   function ()     { console.log('All done!');   /* READ fires when no more data will be provided. */ })
    .on('finish',   function ()     { console.log('All Finished!');  /*WRITEABLE */  })
    .on('close',   function ()     { console.log('close!'); /*WRITEABLE not all streams emit this*/   })

输出:

readable
readable
Data 
readable
readable
Data
readable

UPDATE 这样做的真正目的是做一个像这样的流:

rqt.pipe(zlib.createGunzip()).pipe(csvp).on('finish',function(line){
    console.log("Finished Parsing " + csvp.records + ' ' + line);
});

根本没有经典模式, 在功能上加载一个gzip压缩包,解析csv并显示找到了多少。加载,解压缩和解析都可以正常工作。

但是以下都没有被调用:   - csvp的_flush永远不会被调用   - 开启('完成'事件

1 个答案:

答案 0 :(得分:2)

您正在混合流动模式和非流动模式API。来自文档:

  

请注意,除非数据被完全消耗,否则不会触发结束事件。这可以通过切换到流动模式,或重复调用read()直到你结束来完成。

上面最简单的修补程序只是为了删除“可读”绑定,然后你应该处于常规流动模式,“数据”事件将会触发,直到流为空,然后“结束”才会触发。