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

Javascript 将十六进制摘要写入Node.js中的文件,javascript,node.js,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.

我有一个机器人,它请求打开一个页面,获取图像链接并下载它们。但是,我注意到,当我试图将图像下载到我当前的工作目录时,我收到一个空的图像文件。我在下面提供了一个场景

编辑:

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);
  }
} 
我意识到,造成这种情况的原因是检查图像计数是否等于最大值。出于某种原因,在发出导致写入空白图像的请求时,它没有执行最终写入过程。我如何解决这个问题

代码场景:

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);
  }
} 
var request=require('request');
var crypto=require('crypto');
var fs=需要('fs');
var md5=函数(pic){
var hash=crypto.createHash('md5');
hash.update(pic);
返回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;
对于(变量i=0;i
当您在图像数组中循环并执行请求时,您正在创建异步流。以下代码行仅启动下载,并不等待下载完成:

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);
    }
  });
也可以使用库(例如)来解决此问题


此外,NodeJS运行时会跟踪活动回调(=流)的数量,一旦它们全部完成,NodeJS将退出进程。因此,除非有其他事情迫使你停止程序的
进程。退出
你根本不需要跟踪下载计数。

你的代码对我有效,假设
pics
是一个URL数组,比如你发布的URL。奇怪的是,我一直得到空图像。我已经试着破解这个有一段时间了。我添加了一个测试数组,只是为了给问题添加更多的上下文@PatrikOldsbergI尝试了你发布的链接。一切正常,我感觉有点饿了。哈哈,没问题。我可能有复制品,这可能是造成这种情况的原因。谢谢你的反馈。我编辑了这篇文章。这就是造成问题的原因@帕特里科尔德斯伯格沃利:我欠你一个人情,帮了大忙。我从写这篇文章中学到了很多,我希望这也能帮助其他人。我仍在努力了解这一点,它仍然忽略了计数,并且在计数增加的过程中我无法控制日志。你删除了第一行末尾的分号了吗?是的,当然!我认为这是最好的处理异步。这让我花了一些时间去理解,尤其是当我从未处理过这样的事情时。