gpt4 book ai didi

javascript - node.js - pngjs 错误 : "Stream not writable" randomly

转载 作者:太空宇宙 更新时间:2023-11-04 00:38:45 26 4
gpt4 key购买 nike

我正在与 pngjs 合作通过它的许多方法。大多数时候,它们工作得很好。但是,就像下面的示例一样,我收到错误:“Stream is not writable”

var fs = require('fs'),
PNG = require('pngjs').PNG;

var dst = new PNG({width: 100, height: 50});
fs.createReadStream('http://1.1m.yt/hry7Eby.png') //download this picture in order to examine the code.
.pipe(new PNG())
.on('parsed', function(data) {
console.log(data);
});

这种情况不是单一的,我每天都会在 1 个随机 png 图像上通过所有 pngjs 方法收到此错误,并且该错误显然会导致我的应用程序崩溃。(注意:您不能使用我为您提供的 http 链接和 readStream,您必须下载并重命名它并执行类似的操作):

fs.createReadStream('1.png')

感谢您投入的时间和精力。

最佳答案

这似乎是库中的一个错误,尽管我对此持谨慎态度,因为我不是 PNG 专家。解析器似乎在流仍在写入时完成。它遇到了 IEND,因此称之为:

ParserAsync.prototype._finished = function() {
if (this.errord) {
return;
}

if (!this._inflate) {
this.emit('error', 'No Inflate block');
}
else {
// no more data to inflate
this._inflate.end();
}
this.destroySoon();
};

如果您注释掉 this.destroySoon(); 它会正确完成图像,而不是最终调用此函数:

ChunkStream.prototype.end = function(data, encoding) {

if (data) {
this.write(data, encoding);
}

this.writable = false;

// already destroyed
if (!this._buffers) {
return;
}

// enqueue or handle end
if (this._buffers.length === 0) {
this._end();
}
else {
this._buffers.push(null);
this._process();
}
};

...否则最终会将 stream.writeable 设置为 false,或者,如果您将其注释掉,则会将 null 值插入 _buffers 数组并搞砸 ChunkStream._processRead

我相当确定这是 zlib 解析器完成时间和流完成时间之间的同步问题,因为如果同步执行此操作,它可以正常工作:

var data = fs.readFileSync('pic.png');
var png = PNG.sync.read(data);
var buff = PNG.sync.write(png);
fs.writeFileSync('out2.png', buff);

关于javascript - node.js - pngjs 错误 : "Stream not writable" randomly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37776746/

26 4 0