Как поймать ошибку в NodeJS?

Всем привет. Пишу прокси чеккер для фильтрации бесплатных прокси-серверов. Принцип такой: если тестовый запрос успешный, то добавляем адрес в массив, если ошибка - пропускаем адрес и берем следующий.
Но не получается отловить все ошибки, одна постоянно просачивается мимо trycatch. И что особенно обескураживает, что иногда её получается поймать, а иногда она попадает в uncaught errors и всё ломает.

Запросы шлю родным для NodeJS https, во всех слушателях on('error') прописал console.log(error) и там тишина. Получается что ошибка выскакивает вообще в другом месте и умудряется миновать блок trycatch.

Обновление 23 мая 11:30
Вместо socks прокси пробовал http прокси на основе такого решения, даже tlsConnection.on('error') не помогло поймать эту ошибку

Вопрос: почему эта ошибка проходит мимо trycatch и как её отловить?

Код запроса
return new Promise((resolve, reject) => {
    const httpsOptions: RequestOptions = {
        hostname: ProxyURLs.checkIP,
        port: 443,
        method: HttpMethods.post,
        headers: {
            'Content-Type': 'application/json',
        },
        agent: new SocksProxyAgent({
            host: proxy.ip,
            userId: proxy.login,
            password: proxy.password,
            port: proxy.port,
            type: 5,
            timeout: Seconds.two,
        }),
    };

    const req = https.request(httpsOptions, (res) => {
        res.on('error', reject);
        res.on('data', (data) => {
            const parsed = JSON.parse(data);
            resolve(parsed);
        });
    });

    req.on('error', reject);
    req.end();
});


60a920daf08b2037425449.png
  • Вопрос задан
  • 424 просмотра
Решения вопроса 1
sasha-hohloma
@sasha-hohloma Автор вопроса
React-developer
Проблема оказалась внутри библиотеки SocksProxyAgent. Уже не помню где читал, но где-то на GitHub писали, что такая ошибка вываливается как uncaught, потому что не висит обработчик на событии ошибки для tls.connect.
В итоге исправил
return tls.connect({
    ...omit(opts, 'host', 'hostname', 'path', 'port'),
    socket,
    servername
});


На следующий код
const tlsConnection = tls.connect({
    ...omit(opts, 'host', 'hostname', 'path', 'port'),
    socket,
    servername
});
tlsConnection.on('error', () => {
    return null;
});
return tlsConnection;


Возможно имеет смысл ещё покопаться с библиотекой в поисках более изящного решения. Пока что не работает даже если выкидывать ошибку через throw new Error(). Если найду другое решение, отпишу в комменты
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы