[英]Writing hex digest to file in Node.js
我有一个机器人,它要求打开一个页面并获取图像链接并下载它们。 但是,我注意到当我尝试将图像下载到当前工作目录时,收到了一个空的图像文件。 我在下面提供了一个方案。
编辑:
我意识到造成这种情况的原因是检查图像计数是否等于最大值。 由于某种原因,在发出导致其写入空白图像的请求时,它没有执行最终的写入过程。 我该如何解决?
代码方案:
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);
}
}
当遍历图像数组并执行请求时,您正在创建异步流。 以下代码行仅开始下载,它不等待下载完成:
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
停止程序,否则根本不需要跟踪下载计数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.