Как мне загрузить файл в цикле foreach, используя Node.js через запрос или HTTP?

#javascript #node.js #download

#javascript #node.js #Скачать

Вопрос:

У меня есть массив строк, которые являются ссылками на URL, с которого я хотел бы загрузить содержимое. Массив downloadLinks выглядит следующим образом: ['stackoverFlow.com/File0', 'stackoverFlow.com/File1', 'stackoverFlow.com/File2'] .

Вот код, который я использую, чтобы попытаться загрузить эти файлы. Пример кода как для использования Request, так и для HTTPS.get

 var fs = require ('fs');
var sleep = require('sleep');
var https = require('https');
var request = require('request')

// Using Request: 
var uniqueDownloadLinks = [ ...new Set(downloadLinks)]

for (downloadLink in uniqueDownloadLinks) {
    const download = (url, callback) => {
        request.head(url, (err, response, body) => {
            var file = fs.createWriteStream(dest);
            var dest = 'files/'   response.headers['content-disposition'].toLowerCase().split('filename=')[1].split(';')[0].replace(/"/g, '');
            request(url)
                .pipe(file)
                .on('close', callback)
        })
    }

    download(uniqueDownloadLinks[downloadLink], () => {
        console.log('fileDownloaded')
    })
    sleep.sleep(5);
}


// Using HTTPS.get
var uniqueDownloadLinks = [ ...new Set(downloadLinks)]

for (downloadLink in uniqueDownloadLinks) {
  var download = function(url) {
      var request = https.get(url, function(response) {
        var dest = 'files/'   response.headers['content-disposition'].toLowerCase().split('filename=')[1].split(';')[0].replace(/"/g, '');
        var file = fs.createWriteStream(dest);
        response.pipe(file);
        file.on('finish', function() {
          file.close();
        });
    });
    download(downloadLink);
    sleep.sleep(5);
} 
  

Я протестировал этот код вне циклов foreach в test.js файл, содержащий только код для загрузки файла, и он работает. Вывод файлов, все хорошо. Когда я пытаюсь загрузить с помощью циклов foreach, я ничего не загружаю. Я подозреваю, что это связано с тем, что я пытаюсь загрузить внутри цикла foreach, но трудно отладить, что происходит не так, потому что я никогда не ввожу код запроса (например, пытаюсь использовать console.log(dest) для вывода назначения filename из заголовка content-disposition .

Что я должен сделать, чтобы иметь возможность перебирать этот массив ссылок и загружать каждый файл?

Комментарии:

1. сон ужасен, никогда не используйте его, если вы не знаете, что делаете. Используйте request-promise и async..await вместо API-интерфейсов на основе обратного вызова.

Ответ №1:

Благодаря комментарию, сделанному Estus Flask, я изучил проблему с использованием sleep и определил, что он был прав в своей оценке, что «сон ужасен».

Исправление этого заключается в том, чтобы сделать функцию загрузки асинхронной и использовать обещание для обработки ожидания в 5 секунд.

 async function sleep(milliseconds) {
  return new Promise(resolve => setTimeout(resolve, milliseconds));
}
await sleep(5000)
const $ = await download(uniqueDownloadLinks[downloadLink], () => {
  console.log('fileDownloaded')
})