执行以下代码时遇到问题:
(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。
提前感谢您的帮助。
答案 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);
});
})();
希望有所帮助