#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')
})