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

Javascript 节点js.10 fs.createReadStream streams2未触发结束事件,javascript,node.js,stream,fs,Javascript,Node.js,Stream,Fs,我正在使用Node.js v0.10.26,并尝试使用新的stream2 API, 尤其是可读api 但是“结束”事件从来没有被调用过,我也不知道为什么。我想这就是为什么我的下游转换流组件没有调用它们的_flush、finish、close事件 var rqt = fs.createReadStream('some.csv.gz'); //readable rqt.on('readable', function () { console.log('readable!'); }) .

我正在使用Node.js v0.10.26,并尝试使用新的stream2 API, 尤其是可读api

但是“结束”事件从来没有被调用过,我也不知道为什么。我想这就是为什么我的下游转换流组件没有调用它们的_flush、finish、close事件

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*/   })
产出:
更新 这样做的真正目的是实现如下流:

rqt.pipe(zlib.createGunzip()).pipe(csvp).on('finish',function(line){
    console.log("Finished Parsing " + csvp.records + ' ' + line);
});
它根本不使用经典模式, 在功能上,它加载gzip压缩的csv,解析csv并显示找到的csv数量。加载、解压缩和解析都可以正常工作

但是,不会调用以下各项: -csvp的_flush从未被调用
-on('finish'事件

您将流动模式和非流动模式API稍微混合了一下。从文档中:

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


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

或者我发现添加了一个像这样读取的调用rqt.on('readable',function(){console.log('readable!';rqt.read();})我知道这一点,但尽管如此,他的代码在v0.10.26上对我有效,我得到了他期望的输出。嗯,实际上我尝试了你的建议,删除了.on(“可读的”它对我不起作用是的,我还没有测试它的确切细节,但我很确定基本的问题是缓冲数据期望你调用
read
。如果你得到了事件绑定、流动/非流动模式和方法调用的正确组合,所有这些都应该很好,但你不能只绑定所有的事件并调用所有的方法lly-nilly.Listening for'readable'首先启用streams2模式,但随后以下'data'事件处理程序将其切换为streams1模式。之后,它不会尝试使用原始代码切换回streams2。我遇到了完全相同的问题,您是否以某种方式解决了它?接受的答案似乎无助于Streams就像消防软管g通过管道,如果您处于流动模式,如果您有足够的输入,则必须将其排空..否则它将被备份并且永远无法完成。这是为了防止内存泄漏。
rqt.pipe(zlib.createGunzip()).pipe(csvp).on('finish',function(line){
    console.log("Finished Parsing " + csvp.records + ' ' + line);
});