我有一个机器人,它要求打开一个页面并获取图像链接并下载它们。但是,我注意到当我尝试将图像下载到当前工作目录时,我收到一个空图像文件。我在下面提供了一个场景。
修改
我意识到造成这种情况的原因是检查图像计数是否等于最大值。由于某种原因,在发出请求导致它写入空白图像时,它没有执行最后的写入过程。我该如何解决这个问题?
代码情景:
var request = require('request');
var crypto = require('crypto');
var fs = require('fs');
var md5 = function (pic) {
var hash = crypto.createHash('md5');
hash.update(pic);
return hash.digest('hex');
};
var pics = ['http://37.media.tumblr.com/eea272630e7c0749241b1594b1b911b4/tumblr_n1t63oOzF81rt268so1_1280.jpg',
'http://38.media.tumblr.com/9b40422b9129745292b174ffd683e8f3/tumblr_mvhhcuOQn41rt268so1_1280.jpg',
'http://37.media.tumblr.com/7f96f676610efa9beb2f322c4f6eeb36/tumblr_mudrsmtKtl1r4lu5ao1_1280.jpg'
];
var downloadCount = 0, max = 2;
for (var i = 0; i < pics.length; i++) {
var hexDigest = md5(pics[i]) + pics[i].slice(-4);
request(pics[i]).pipe(fs.createWriteStream(process.cwd() + '/' + hexDigest));
downloadCount++;
if (downloadCount === max) {
process.exit(0);
}
}
答案 0 :(得分:0)
当您循环遍历图像数组并执行请求时,您将创建异步流。以下代码行仅启动下载,不等待下载完成:
request(pics[i]).pipe(fs.createWriteStream(process.cwd() + '/' + hexDigest));
当您检查下载次数并在达到最大值后退出流程时,下载会在他们有机会启动之前中断。
一种可能的解决方案是将下载计数器移动到流上的end
事件侦听器,如下所示:
request(pics[i]).pipe(fs.createWriteStream(process.cwd() + '/' + hexDigest))
.on('end', function () {
downloadCount++;
if (downloadCount === max) {
process.exit(0);
}
});
也可以使用async等库来解决。
此外,NodeJS运行时会跟踪活动的回调(=流)的数量,一旦完成,它将退出流程。因此,除非有其他事情迫使您使用process.exit
停止程序,否则您根本不需要跟踪下载计数。