Чекер проксей на NodeJS работает меньше секунды. Где ошибка?
Запускаю чекинг фрии проксей на ноде 18.
Вот какие npm пакеты стоят :

После запуска кубика NodeJS . Нода работает меньше секунды и в переменой [[SAVED_CONTENT_GOOD_PROXYS]] по итогу unefined. Ну не может же прокси чекер на 300 проксей отработать меньше секунды, значит он и не начинает проверять прокси) .
Хоть прокся чекеру скармливаю через список [[SAVED_CONTENT]] , хоть в виде списка прям в коде - эффект один , кубик работает меньше секунды! Даже ошибки ни какие в логе не выдаёт.
Проксей для примера здесь мало в коде отобразил, в по факту их более 300 шт. Где ошибка?
Код чекера на NodeJS 18:
const http = require('http');
const HttpProxyAgent = require('http-proxy-agent');
const axios = require('axios');
// const SAVED_CONTENT = [[SAVED_CONTENT]];
const SAVED_CONTENT = ['170.155.2.119:80','164.132.170.100:80','172.245.159.177:80','165.154.236.214:80','209.97.150.167:8080','107.173.80.140:9000'];
const testUrl = 'http://www.google.com';
const timeout = 1000;
const goodProxys = [];
async function checkProxies(proxies) {
const promises = proxies.map(proxy => {
return new Promise(async resolve => {
try {
const response = await axios.get(testUrl, {
proxy: {
host: proxy.split(':')[0],
port: parseInt(proxy.split(':')[1], 10)
},
timeout: timeout
});
if (response.status === 200) {
goodProxys.push(proxy);
}
} catch (error) {
// console.log(`Error with proxy ${proxy}:`, error.message);
[[ERROR_MESSAGE]] = error.message;
}
resolve();
});
});
await Promise.all(promises);
return goodProxys;
}
(async () => {
const result = await checkProxies(SAVED_CONTENT);
// console.log('Good proxies:', result);
[[SAVED_CONTENT_GOOD_PROXYS]] = result;
})();
Ответы (1 шт):
Для node v19.8.1,
checkProxyList проверка списка проксей, одновременная и не оптимальная, как у вас
checkProxy проверка конкретного прокси
и я установил таймаут 10секунд, мне кажется так лучше
import axios from 'axios';
try {
const result = await checkProxyList([
'170.155.2.119:80',
'164.132.170.100:80',
'172.245.159.177:80',
'165.154.236.214:80',
'209.97.150.167:8080',
'107.173.80.140:9000'
]);
console.log(result);
} catch (err) {
console.error(err);
}
/**
* @param {Readonly<string[]>} inputProxyList
* @param {Readonly<string>} [urlForChecking]
* @param {Readonly<import('axios').AxiosRequestConfig>} [axiosRequestConfig]
* @returns {Promise<string[]>}
*/
async function checkProxyList(
inputProxyList,
urlForChecking,
axiosRequestConfig
) {
const checkingResult = await Promise.allSettled(
inputProxyList.map(
(x) => checkProxy(x, urlForChecking, axiosRequestConfig)
)
);
const result = checkingResult.reduce(
(/** @type {string[]} */ acc, x, idx) => {
if (x.status === 'fulfilled' && x.value === true) {
acc.push(inputProxyList[idx]);
}
if (x.status === 'rejected') {
console.error(x.reason);
}
return acc;
},
[]
);
return result;
}
/**
* @param {Readonly<string>} inputProxy
* @param {Readonly<string>} [urlForChecking]
* @param {Readonly<import('axios').AxiosRequestConfig>} [axiosRequestConfig]
*/
async function checkProxy(
inputProxy,
urlForChecking = 'http://www.google.com',
axiosRequestConfig = { timeout: 10000 }
) {
if (inputProxy) {
const [proxyHost, proxyPost = 80] = inputProxy.split(':');
try {
const response = await axios.get(urlForChecking, {
proxy: { host: proxyHost, port: +proxyPost },
...axiosRequestConfig,
});
return [200, 201].includes(response.status);
} catch (err) {
console.warn(`[FAIL] ${inputProxy}: ${err.message}`);
}
}
return false;
}
export {};
Вывод в консоль:
$ node fetch-proxies.js
[FAIL] 172.245.159.177:80: Request failed with status code 429
[FAIL] 209.97.150.167:8080: Request failed with status code 503
[FAIL] 164.132.170.100:80: timeout of 10000ms exceeded
[FAIL] 107.173.80.140:9000: timeout of 10000ms exceeded
[ '170.155.2.119:80', '165.154.236.214:80' ]
Совет: когда у вас справочник проксей будет большим, вам станет не удобно делать одновременно проверку всех хостов. тогда можно будет организовать очередь выполнения проверок. для таких задач я обычно пользуюсь библиотекой p-queue.