在节点中获取100个zip文件

时间:2014-03-05 04:01:21

标签: node.js

所以我试图从服务器上获取一堆文件。目前的代码基本如下。

var http = require('http');
var fs = require('fs');

var arr = [{id:'fileOne', id:'fileTwo', id:'fileThree',....];

function fetchData() {
  for (var i = 0; i < arr.length; i++) {
    var file = fs.createWriteStream("../path/file.zip");
    var request = http.get("url/AFG_adm.zip", function(response) {
      response.pipe(file);
    });   
  } 
}

我不认为这是最好的方法,试图弄清楚如何处理错误,如何确保在下一次迭代之前加载文件...任何帮助都非常感谢。

1 个答案:

答案 0 :(得分:1)

您应该使用async模块来处理异步部分,request模块也会为您节省很多精力。

您可以使用async.cargoasync.map以多种方式处理此问题。 理论是将事物或一系列事物分组,然后根据你想要它做的事情采取行动,但是以异步方式。

所以要下载的文件数组的基本.map就是这样的。

// required modules
var async = require('async');
var request = require('request');
// array of urls
var URLs = ['hxxp://...ZipFile1.zip', 'hxxp://...ZipFile2.zip'];
// destination directory
var destinationDirectory = 'downloads';
// asyncDownload function
function asyncDownload(url, callback) {
  // get filename
  var filename = url.substring(url.lastIndexOf(".") + 1);
  // create write stream
  var stream = fs.createWriteStream(destinationDirectory + "/" + filename);
  // listen for open event to start request and pipe
  stream.on('open', function () {
    request(url).pipe(stream);
  })
  // when finish , call callback
  stream.on('finish', function () {
    callback(null, destinationDirectory + "/" + filename);
  })
}

async.map(
  URLs, asyncDownload, function (err, results) {
    console.log(results);
  });