Задать вопрос
@leelusama
Junior Frontend developer

Как правильно сделать много request запросов на Node js?

Задача:
Есть 5000 urls. Необходимо проверить каждый url существует он или нет. Отправить head запрос и если статус ответа 200 то все ок.

const axios = require('axios');
const promises = [];

[5000].forEach((url) => {
  promises.push(axios.head(url).catch(() => ({ status: 'error' })));
});
Promise.all(promises)
  .then((results) => {
    //do somthing with result
  })
  .catch((err) => {
    //do somthing with error
  });


Я понимаю, что так не правильно, но оно так работает, но очень долго.

Посоветуйте куда копать. Дайте совет. Скажите что это не работает так в node js или вообще....
Можно конечно по очереди проверять каждый url, но так будет долго.
Как правильно сделать много запросов единовременно и какие ограничения существуют?
  • Вопрос задан
  • 416 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@Azperin
Дилетант
Довольно давно делал примерно под такую же задачу, мб поможет.

var http = require('http');
var maxSimRequests = 10; // сколько запросов активно одновременно
var urls = []; // массив ссылок которые надо проверить
var urlsInWork = urls.splice(0, maxSimRequests);
if (urlsInWork.length === 0 || maxSimRequests < 1) return;
urlsInWork.forEach(requestFn);

var voidInterval = setInterval(() => {
	// впринципе можно и без интервала обойтись, не помню зачем его делал
}, 10);

function requestFn(url) {
	http.get(url, (response) => {
		let { statusCode } = response;
		if (statusCode === 200) {
			// что то делаем с response
		} else if (statusCode === 404) {
			urlDone(url);
		} else {
			setTimeout(() => {
				requestFn(url);
			}, 1000);
		};
	}).on('error', (err) => {
		// какойто хендл ошибки
		urlDone(url);
	});
};

function urlDone(url) {
	urlsInWork = urlsInWork.filter(u => u !== url);
	if (urls.length > 0) {
		let nextUrl = urls.pop();
		urlsInWork.push(nextUrl);
		requestFn(nextUrl);
	} else if (urlsInWork.length === 0) {
		clearInterval(voidInterval);
	};
};
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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