节点 js .10 fs.createReadStream 流 2 结束事件未触发
Posted
技术标签:
【中文标题】节点 js .10 fs.createReadStream 流 2 结束事件未触发【英文标题】:node js .10 fs.createReadStream streams2 end event not firing 【发布时间】:2014-06-06 03:51:06 【问题描述】:我正在使用 Node.js v0.10.26,并尝试使用新的 stream2 apihttp://blog.nodejs.org/2012/12/20/streams2/, 特别是 Readable api,http://nodejs.org/api/stream.html#stream_class_stream_readable
但“结束”事件永远不会被调用,我不知道为什么。我认为这就是为什么我的下游转换流组件没有调用他们的 _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*/ )
输出:
readable
readable
Data
readable
readable
Data
readable
更新 这样做的真正目标是做一个这样的流:
rqt.pipe(zlib.createGunzip()).pipe(csvp).on('finish',function(line)
console.log("Finished Parsing " + csvp.records + ' ' + line);
);
完全不使用经典模式, 在功能上加载压缩的 csv,解析 csv 并显示找到了多少。加载、解压缩和解析一切正常。
但是,以下都没有被调用: - csvp 的 _flush 永远不会被调用 - on('finish' 事件
【问题讨论】:
我也有同样的问题,请问您解决了吗?接受的答案似乎没有帮助 流就像一根穿过管道的消防水带,如果你处于流动模式,如果你有足够的输入,你必须把它排干..否则它会被备份并且永远不会结束。这是为了防止内存泄漏。 【参考方案1】:您正在混合使用流动模式和非流动模式 API。来自文档:
请注意,除非完全消耗数据,否则不会触发 end 事件。这可以通过切换到流动模式来完成,或者通过重复调用 read() 直到结束。
对上面的 sn-p 的最简单修复就是删除“可读”绑定,然后您应该处于常规流动模式,并且“数据”事件将触发,直到流为空,然后“结束”将触发。
【讨论】:
或者我发现像这样添加了一个读取调用 我知道这一点,但他的代码在 v0.10.26 上为我工作,我得到了他期望的输出。 嗯,实际上我尝试了您删除 .on("readable" 的建议,但它对我不起作用 是的,我还没有测试它的确切细节,但我很确定基本问题是缓冲数据,希望您致电read
。如果你得到了事件绑定、流动/非流动模式和方法调用的正确组合,一切都应该很好,但你不能只是绑定所有事件并随意调用所有方法。
侦听“可读”首先启用streams2模式,但随后的“数据”事件处理程序将其切换为streams1模式。之后它不会尝试使用原始代码切换回streams2。以上是关于节点 js .10 fs.createReadStream 流 2 结束事件未触发的主要内容,如果未能解决你的问题,请参考以下文章