node.js - pngjs错误:"流不可写"随机

时间:2016-06-12 16:47:02

标签: javascript node.js stream png

我正在通过其中的许多方法与pngjs合作。大多数时候,他们工作正常。但是,如下例所示,我收到错误:" Stream不可写"

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);
    });

这种情况不是单一的,我每天一次通过所有pngjs方法在1个随机png图像上得到此错误,并且该错误显然会导致我的应用程序崩溃。 (注意:你不能使用我给你带的readStream的http链接,你必须下载并重命名它并做类似的事情):

fs.createReadStream('1.png')

感谢您的时间和精力。

1 个答案:

答案 0 :(得分:0)

这似乎是图书馆中的一个错误,但我担心这样说,因为我不是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,或者,如果您对此进行评论,则将空值推送到_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);