节点应用程序正在等待来自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(); });