节点应用程序正在等待来自Stream的最后一个“可读”事件

我正在从一个Web服务加载图像的Node.js应用程序,通过使用ImageMagick处理缩略图,并将结果保存到此Web服务。 工作stream程是类似的

[Web Service] ==> HTTP Response Stream ==> ImageMagick ==> HTTP Request Stream ==> [Web Service]

我使用Node.js http模块检索原始图像stream并保存缩略图stream,并使用imagemagick-stream模块生成缩略图,而不使用任何临时文件。 由于我还需要发送缩略图长度,所以我利用memorystream模块来将缩略图保存在内存中。 所以工作stream改变了[Web Service] ==> HTTP Response Stream ==> ImageMagick ==> memory stream ==> HTTP Request Stream ==> [Web Service]

该代码在我的笔记本电脑(Mac)和工作站(Windows)中运行良好,但在具有特殊PNG图像的Ubuntu服务器上不起作用。 但是这个图像在Mac和Windows上运行得很好,而且如果我使用ImageMagick命令行的话,它也能工作,所以这不是一个糟糕的图像。

这种现象是,当处理这个图像时,我的应用程序继续等待从ImageMagick接收数据,这意味着它永远不会触发“结束”或“错误”事件。 当我在我的Mac上尝试时,我可以看到ImageMagick发出了3个“可读”事件,这意味着它处理了3个数据块。 但在Ubuntu上,它只发出了2个“可读”的事件,然后我的代码呆在那里。

我不知道为什么会发生这种情况? 由于图像可以在Mac,Windows上处理,并且可以在命令行上在Ubuntu上处理,所以我不认为这是因为图像和ImageMagick。 我强烈的怀疑有处理stream的东西是错误的,但不知道。

下面是一些伪代码

 var im = require('imagemagick-stream');
 var MemoryStream = require('memorystream');

 //定义ImageMagick参数
 var thumbnail = im()。thumbnail(options.width +'> x'+ options.height +'>')。quality(options.quality);

 //检索原始图像
 http.request('我的web服务',函数(res){
     //生成缩略图
     res.pipe(缩略图);

     //将缩略图传送到内存stream(已暂停)以检索其长度
     var ms = new MemoryStream();
     ms.pause();
     thumbnail.pipe(MS);
     var length = ms._getQueueSize();

     //保存
     http.request('我的web服务',长度,function(res){
         // ...
     });
     ms.pipe(REQ);
     ms.resume();
 });