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

时间:2013-09-29 07:00:53

标签: node.js stream imagemagick memorystream

我正在开发一个Node.js应用程序,该应用程序从Web服务加载图像,使用ImageMagick处理缩略图,并将结果保存回此Web服务。工作流程类似于

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

我正在使用Node.js http模块检索原始图像流并保存缩略图流,并使用imagemagick-stream模块生成缩略图而不使用任何临时文件。由于我还需要发送缩略图长度,我使用memorystream模块将缩略图保存在内存中。所以工作流程改变了 [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。我强烈怀疑处理流有什么问题,但不知道。

下面的一些伪代码

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

// define ImageMagick parameters
var thumbnail = im().thumbnail(options.width + '>x' + options.height + '>').quality(options.quality);

// retrieve original image
http.request('my web service', function (res) {
    // generate thumbnail
    res.pipe(thumbnail);

    // pipe the thumbnail into memory stream (paused) in order to retrieve its length
    var ms = new MemoryStream();
    ms.pause();
    thumbnail.pipe(ms);
    var length = ms._getQueueSize();

    // save back
    http.request('my web service', length, function (res) {
        // ...
    });
    ms.pipe(req);
    ms.resume();
});

0 个答案:

没有答案