首页 > 解决方案 > 使用 Node js 从 Web 下载文件并循环

问题描述

我想使用以下代码从网上下载多个文件:

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

    var file;
    for(var i = 1; i <= 5; i++) {
         //CHECK IF REMOTE FILE EXISTS
         request('http://webaddress.com/filename' + i + '.jar', function (err, resp) {

         //IF EXISTS DO
         if (resp.statusCode == 200) {
             //DOWNLOAD DATA AND CREATE A NEW .JAR FILE
             file = fs.createWriteStream('D:\\filename' + i + '.jar');
             http.get('http://webaddress.com/filename' + i + '.jar', function(response) {
                  response.pipe(file);
                  file.on('finish', function() {
                      file.close();
                  });
             });
         }

         //FILE DOES NOT EXIST
         });
     }

我想要的结果是:使用文件名filename1-5.jar下载了多个文件。我得到的结果只是一个文件名为 filename5.jar的文件(或循环中 i var 的最后一个值)。我究竟做错了什么?

标签: javascriptnode.js

解决方案


就像@Ionut 说你的请求是异步的,所以你需要等待它

let fs = require('fs');
let request = require('request');

let download = (uri, filename) => {
    return new Promise ((resolve, reject) => {
        request.head(uri, function(err, res) {

            if (res.statusCode === 200) {
                request(uri).pipe(fs.createWriteStream(filename)).on('close', resolve);
            } else {
                reject(res.statusCode);
            }
        });
    });
};

let promises = [];

for(let i = 1; i <= 5; i++) {
    promises.push(download('http://webaddress.com/filename' + i + '.jar', 'D:\\filename' + i + '.jar'));
}

Promise.all(promises).then(() => {
    process.exit(0);
}); 

推荐阅读