将十六进制摘要写入Node.js中的文件

时间:2014-07-17 19:58:44

标签: javascript 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);
  }
} 

1 个答案:

答案 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停止程序,否则您根本不需要跟踪下载计数。