Как поймать getaddrinfo ENOTFOUND

У меня есть список ссылок, которые мне нужно проверить перед обработкой некоторых данных. Проверка заголовков с http.get возвращает ошибку:

events.js:72   
        throw er; // Unhandled 'error' event    
          ^    
Error: getaddrinfo ENOTFOUND       
    at errnoException (dns.js:37:11) 

Я не могу справиться с этой ошибкой и выйдет из процесса. Я попробовал res.on( "error" ) и try..catch на http.get, но ничего не работает.

Ниже приведен фрагмент кода, а вот живой пример на runnable.com

//This is OK
getHeaders('http://google.com/404pag-that-does-not-exit');


//Here is the error.
//Uncoughtable error!
getHeaders('http://doesnotexistooooo.com');

function getHeaders(link){
    var _http = require("http");
    var myUrl = require("url");

    var qs=(myUrl.parse(link).search==null) ? "" : myUrl.parse(link).search ;
    var path=myUrl.parse(link).pathname;

    var options = {
        hostname: myUrl.parse(link).hostname,
        path: path+qs,
        method: 'HEAD'
    };
    _http.get(options, function(res) {
        res.on('error',function(e){
            console.log("Error: " + myUrl.parse(link).hostname + "\n" + e.message); 
            console.log( e.stack );
        });
        console.log('STATUS: ' + res.statusCode);
        console.log('HEADERS: ' + JSON.stringify(res.headers));
    });

}

Ответ 1

Вам просто нужно обработать событие error, как указано в сообщении об ошибке. Согласно документации:

Если во время запроса встречается какая-либо ошибка (будь то с разрешением DNS, ошибками уровня TCP или фактическими ошибками разбора HTTP), на возвращенный объект запроса испускается событие "ошибка".

Вот пример использования:

var getRequest = _http.get(options, function(res) {
    // …
});
getRequest.on('error', function (err) {
    console.log(err);
});

который дает:

$ node test.js
{ [Error: getaddrinfo ENOTFOUND] code: 'ENOTFOUND', errno: 'ENOTFOUND', syscall: 'getaddrinfo' }

Ответ 2

На самом верхнем уровне вы можете сделать

process.on('uncaughtException', function(err) {
  console.log('### BIG ONE (%s)', err);
});

Ответ 3

если вы используете запрос npm

request
  .get('http://example.com/doodle.png')
  .on('response', function(response) {
    console.log(response.statusCode) // 200
    console.log(response.headers['content-type']) // 'image/png'
  })
  .on('error', function(err) {   // <------- add this 
    console.log(err)
  });