@BestJS

Почему http запрос зависает?

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

const fs = require('fs');
const request = require('request');
let arr = [];
let counter = 0;

saveFile()
function saveFile(){
	console.log("");
	console.log(arr.length - counter, counter, "Начал качать: ", arr[counter].from);
	console.log("to", arr[counter].to)
	request({ // Вот на этом моменте тормозится процесс
		url: arr[counter].from,
		method: 'GET',
		encoding: "binary"
	}, (err, req, res)=>{ 
		console.log("Скачал ")

		if(err){
			console.log("НЕ удалось скачать фаил", arr[counter].from);
			return saveFile();
		}
		fs.writeFile(arr[counter].to, res, 'binary', (err)=>{
			if(err) throw err;
				console.log("Сохранил ")
				counter++;
				setTimeout(saveFile, 1000);
		});
	});
}

Пробывал также потоками, тоже самое
function saveFile(){
	let stream = fs.createWriteStream(arr[counter].to)
	let readStream = request.get(arr[counter].from)
	.pipe(stream)
	console.log("");
	console.log(arr.length - counter, counter, "Начал качать: ", arr[counter].from);
	console.log("to", arr[counter].to)
	stream.on('finish', () => {
		console.log("Скачал ")
		counter++;
		setTimeout(saveFile, 1000);
	});
}
  • Вопрос задан
  • 521 просмотр
Решения вопроса 1
@BestJS Автор вопроса
Сделал для себя такое решение.
Со второго или третьего раза скачивание начинается без проблем!
function saveFile() {

	console.log("");
	let timeStap = new Date();
	console.log(arr[counter].from)

	const fetch = (isHttpsResource(arr[counter].from)) ? https : http;

	const req = fetch.get(arr[counter].from, (res) => {
		console.log(arr.length - counter, counter, "Начал качать: ");
		console.log("to", arr[counter].to)

		let stream = fs.createWriteStream(arr[counter].to);
		res.pipe(stream)
		res.on('end', () => {
			console.log("Сохранил за: ", new Date-timeStap, "мс")
			counter++;
			clearTimeout(timeout); // Чистим timeout ...
			setTimeout(saveFile, 500);
		});
	});

	// Если запрос не пришел в течении 5 секунд то обрываем его.
	let timeout = setTimeout(()=>{ 
		req.abort();
	}, 5000);
	
	//После обрыва запускаем заново.
	req.on("error", (err)=>{
		console.log("err", err)
		saveFile()
	});
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы