Node.js 等待完成流的读取请求

Node.js 等待完成流的读取请求,node.js,stream,Node.js,Stream,我习惯于读写一些PNG。我定期收到此错误: Error: There are some read requests waiting on finished stream at ChunkStream._end (/home/mbayazit/qatools/pdiff/node_modules/pngjs/lib/chunkstream.js:107:13) at ChunkStream.end (/home/mbayazit/qatools/pdiff/node_modules

我习惯于读写一些PNG。我定期收到此错误:

Error: There are some read requests waiting on finished stream
    at ChunkStream._end (/home/mbayazit/qatools/pdiff/node_modules/pngjs/lib/chunkstream.js:107:13)
    at ChunkStream.end (/home/mbayazit/qatools/pdiff/node_modules/pngjs/lib/chunkstream.js:94:14)
    at PNG.end (/home/mbayazit/qatools/pdiff/node_modules/pngjs/lib/png.js:105:18)
    at ReadStream.onend (_stream_readable.js:483:10)
    at ReadStream.g (events.js:175:14)
    at ReadStream.EventEmitter.emit (events.js:117:20)
    at _stream_readable.js:910:16
    at process._tickCallback (node.js:415:13)
但是在我的程序里它没有给我一个行号

不过,我只在少数几个地方处理溪流,它们是:

fs.createReadStream(oldScreen).pipe(new PNG).on('parsed', function() {
    promises[0].resolve(this);
});

fs.createReadStream(newScreen).pipe(new PNG).on('parsed', function() {
    promises[1].resolve(this);
});

这三个文件名从来都不相同,因此它们不应该读/写到同一个位置。我想有可能是因为之前的失败运行没有正确关闭流。有什么办法可以强制所有流很好地关闭吗?

两个建议:

  • 使用时,它可能会在代码中提供行号。(异常发生在异步块中,因此堆栈跟踪不包含程序,它只与V8主循环中的tick处理程序进行堆栈)

  • 问题似乎在于,有人试图读取刚刚“结束”(已关闭,或已到达其末端,底层发出“结束”信号)的流


  • 您可能需要查看
    PNG
    类的文档。我的猜测是其中有一些东西(因为调用堆栈在
    PNG.end
    中变得有趣)。具体来说,您的问题可能在您正在创建的
    PNG
    实例(
    .pipe(new PNG)
    )的生命周期内,可能它需要一个
    .close()
    之类的东西。程序的流程是,它使用selenium webdriver将我的网页的屏幕截图保存为PNG,然后我使用PNGJS读取和操作它。我想问题可能是我使用了
    fs.writeFile
    而不是
    fs.writeFileSync
    ,因此它试图在完成编写之前读取PNG。写入可能只需要几毫秒,因此只有当读卡器超过写入器时才会发生错误。这个问题悄悄地出现在我身上,因为我以前没有先将它保存到磁盘,而是直接将它传送到PNGJS。longjohn这次抛出了异常,但它仍然没有提供更多信息;没有行号。唯一读取文件流的应该是PNGJS本身。。。。可能是图书馆里的一个bug,不确定。编辑:我想我可能知道问题出在哪里。@Mark:我一直收到相同的错误。每次我运行一个在我点击控制C之前运行得很好的脚本时,似乎都无法停止接收它。你解决过这个问题吗?@Mark:我想是这样的。“我的脚本”打开一个文件文件夹,向文件中添加新数据,然后将其保存回该文件夹。当我点击Control-C时,一堆文件以某种损坏的方式保存。每当我再次运行脚本时,它都无法从损坏的文件中读取数据,并且发生了一个错误。因此,错误消息“有一些读取请求等待完成流”可以理解为“无法读取文件”。
    result.png.pack().pipe(fs.createWriteStream(diffName));