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

Tro*_*rks 5 javascript stream fs node.js

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

但'结束'事件永远不会被调用,我无法弄清楚为什么.我认为为什么我的下游Transform流组件没有调用他们的_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*/   })
Run Code Online (Sandbox Code Playgroud)

输出:

readable
readable
Data 
readable
readable
Data
readable
Run Code Online (Sandbox Code Playgroud)

更新这个的真正目标是像这样做一个流:

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

根本没有使用经典模式,在功能上加载一个gzip压缩包,解析csv并显示有多少被发现.加载,解压缩和解析都可以正常工作.

但是没有以下任何一个被调用: - csvp的_flush永远不会被调用 - on('finish'事件

Pet*_*ons 2

您稍微混合了流动模式和非流动模式 API。来自文档:

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

对上面代码片段的最简单的修复就是删除“可读”绑定,然后您应该处于常规流动模式,并且“数据”事件将触发,直到流为空,然后“结束”将触发。