命令失败:gm识别:无法打开文件(2)[没有这样的文件或目录]。 gm模块和ES6 Promises

时间:2016-01-25 21:09:07

标签: javascript node.js graphicsmagick

执行以下代码时遇到问题:

(function(){
var gm = require('gm');
var Promise = require('es6-promise')
.Promise;

function imgAsPromise(imageUrl){
    return new Promise(function(resolve, reject){
        gm(imageUrl)
         .size(function(err, size) {
            if (err) {
              reject(err);
            }

          resolve(size);

       });
    });
}

var imgPromises = [];
var imgUrls = [
'http://cdn.hiconsumption.com/wp-content/uploads/2014/10/2015-Porsche-911-GTS-4.jpg',
'http://avtomaniya.com/pubsource/photo/10712/118-porsche-911-carrera-4-gts-2015-test-drive-avtomaniya-jpg.jpg',
'http://www.joesdaily.com/wp-content/uploads/2014/03/2015-Porsche-Cayman-GTS-2.jpg'
];

for(url in imgUrls){
    imgPromises.push(imgAsPromise(url));

}

Promise.all(imgPromises)
 .then(function(sizes){
    for(size in sizes){
        console.log(size);
    }
 }).catch(function(error){
    console.log("Promise.all error:" + error);
 });

})();

问题在于,在运行代码时它会中断并显示以下错误消息:

  

Promise.all错误:错误:命令失败:gm识别:无法打开   file(2)[没有这样的文件或目录]。 gm识别:请求没有   返回图片。

我验证了图像来源并且每个都存在。承诺应该在获得所有图像大小后解决,但事实并非如此。我很感激你的帮助,找出这段代码可能出错的地方。

我在Windows 10和GraphicsMagick版本1.3.23 Q16 64位上使用Node.js 5.3.0。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我猜它没有创建临时文件。

该命令将文件下载到临时文件,然后导入GM。如果临时目录不存在,它将失败。

尝试手动下载(Downloading images with node.js),然后在磁盘上的文件上本地运行。最糟糕的情况是,您将收到更好的错误消息。

答案 1 :(得分:0)

我认为你无法使用gm获取图像。

例如,request package可以做的是:

// Include your request package dependency
var request = require('request');

// Go find the image, and retrieve it
request.get(imageOrig.name, { encoding: null }, function (err, response, data) {

        // Is there any errors during retrieve your image
        if (err) throw err;

        // If nope, you can directly manipulate your image data
        // Then your data, here, is the image encoded in base64
        gm(data)

            // And don t forget to return 
            // Something inside your promise
            // Even if there is an error or not. 
            // Otherwise nothing will be return is your promise result
            .size(function(err, size) {
                if (err) {
                     return reject(err);
                }

                return resolve(size);
            });

}); 

所以在你的情况下

(function(){
var gm = require('gm');
var Promise = require('es6-promise')
    .Promise;

function imgAsPromise(imageUrl){
    return new Promise(function(resolve, reject){
        return request.get(imageUrl, { encoding: null }, function (err, response, data) {

            // Is there any errors during retrieve your image
            if (err) throw err;

            // If nope, you can directly manipulate your image data
            // Then your data, here, is the image encoded in base64
            gm(data)

                // And don t forget to return 
                // Something inside your promise
                // Even if there is an error or not. 
                // Otherwise nothing will be return is your promise result
                .size(function(err, size) {
                    if (err) {
                        return reject(err);
                    }

                    return resolve(size);
                });

        });

    });
}

var imgPromises = [];
var imgUrls = [
    'http://cdn.hiconsumption.com/wp-content/uploads/2014/10/2015-Porsche-911-GTS-4.jpg',
    'http://avtomaniya.com/pubsource/photo/10712/118-porsche-911-carrera-4-gts-2015-test-drive-avtomaniya-jpg.jpg',
    'http://www.joesdaily.com/wp-content/uploads/2014/03/2015-Porsche-Cayman-GTS-2.jpg'
];

for(url in imgUrls){
    imgPromises.push(imgAsPromise(url));

}

Promise.all(imgPromises)
    .then(function(sizes){
        for(size in sizes){
            console.log(size);
        }
    }).catch(function(error){
        console.log("Promise.all error:" + error);
    });

})();

希望有所帮助