节点 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 结束事件未触发的主要内容,如果未能解决你的问题,请参考以下文章

如何在谷歌云构建上升级节点 js 版本

<scripts> 节点 js 加载失败

从javascript获取和从node.js获取节点,有啥区别[关闭]

web学习记录-JS-10

Java节点操作(JS原生+JQuery)

Node.js 10 的 TypeScript tsconfig 设置?