繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM