Обработка ошибки Nod.js, действие не завершается



  • Требуется чтобы Нода корректно (без задержки) возвращала ответ и корректно обрабатывала ошибку при отсутствии интернета (для проверки можно разорвать подключение по локальной сети) (ошибка будет {"errno":"ENOTFOUND","code":"ENOTFOUND","syscall":"getaddrinfo","hostname":"encrypted.google.com"}
    Код скрипта:

    
    const https = require('https');
    
    
    await(new Promise((resolve, reject) => {
    
        var options = {
            hostname: 'encrypted.google.com',
            port: 443,
            path: '/',
            method: 'GET'
        };
    
        var req = https.request(options, (res) => {
            console.log('statusCode:', res.statusCode);
            console.log('headers:', res.headers);
    
            res.on('data', (d) => {
                console.log(d);
            });
    
        });
        req.end();
    
        req.on('error', (e) => {
            console.log('ошибка');
            console.log(e);
            resolve()
        });
    
    }));
    
    

    Если я resolve() ставлю там где ошибка (как в коде), то скрипт отрабатывает, но действие не завершается сразу, только после таймаута.
    Если я resolve() ставлю после основного ответа (т.е. после console.log(d);), то при отсутствующем интернете, то я получаю ошибку (мне это и надо), но но действие не завершается сразу, только после таймаута.

    Мне требуется чтобы после выполнения блока Node.js скрипт БАС продолжил свою работу (т.е. не должно писать красным в лог, с остановкой). При этом при работающем интернете в лог выводился основной ответ (переменная "d"), при отсутствии интернета - выводилась ошибка ({"errno":"ENOTFOUND".....). И все это было без задержек Ноды в 1 минуту.
    Полагаю тут нужно добавить условный оператор. Не силен в Ноде. Буду благодарен за любую помощ.



  • @botovod у вас в запросе нет обработчика ошибки, подойдёт даже такой вариант:

    const https = require('https');
    
    
    await(new Promise((resolve, reject) => {
    
        var options = {
            hostname: 'encrypted.google.com',
            port: 443,
            path: '/',
            method: 'GET'
        };
    
        var req = https.request(options, (res) => {
            console.log('statusCode:', res.statusCode);
            console.log('headers:', res.headers);
    
            res.on('data', (d) => {
                console.log(d);
                resolve()
            });
    
            res.on('error', (e) => {
                console.log('ошибка');
                console.log(e);
                resolve()
            });
    
        });
        req.end();
    
        req.on('error', (e) => {
            console.log('ошибка');
            console.log(e);
            resolve()
        });
    
    }));
    

    2e02f617-8132-4fa4-a3f3-76e48011623a-изображение.png


Log in to reply