【发布时间】:2013-09-11 17:51:35
【问题描述】:
我正在使用pngjs 来读写一些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);
});
和
result.png.pack().pipe(fs.createWriteStream(diffName));
这三个文件名永远不会相同,所以它们不应该读/写到同一个地方。我想有可能一个流没有从以前的失败运行中正确关闭。有没有办法可以强制所有流很好地关闭?
【问题讨论】:
-
您可能需要查看
PNG类的文档。我的猜测是其中有一些东西(因为调用堆栈在PNG.end变得有趣)。具体来说,您的问题可能在您正在创建的PNG实例的生命周期中(.pipe(new PNG)),也许它需要.close()或其他东西。 -
程序的流程是它使用selenium webdriver将我的网页截图保存为PNG,然后我使用PNGJS读取和操作它。我认为问题可能是我使用了
fs.writeFile而不是fs.writeFileSync,所以它试图在完成写入之前读取PNG。写入可能只需要几毫秒,因此只有当阅读器领先于作者时才会发生错误。这个问题突然出现在我身上,因为我之前直接将它通过管道传输到 PNGJS 而没有先保存它做磁盘。