在GetAddrInfoReqWrap.onlookup之后防止应用程序崩溃:getaddrinfo ENOTFOUND

时间:2017-04-27 15:30:37

标签: javascript node.js http httprequest

我正在使用Node.js 7.8.0而我正在尝试向某些主机发送HTTP请求,有时候所需的主机不存在。在这种情况下,我收到以下消息:

events.js:163
      throw er; // Unhandled 'error' event
      ^

Error: getaddrinfo ENOTFOUND js.js js.js:80
    at errnoException (dns.js:28:10)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:73:26)

Press any key to continue...

其中js.js是不存在主机的演示。重要的是要注意,如果我向现有主机发送相同的请求,一切都能正常工作。

问题是这个错误导致我的Node.js应用程序崩溃,而我需要让应用程序继续运行。

我已经检查过,我的HTTP请求在http字段中不包含https / port / host

我尝试使用try/catchdomainsres.on('error', exitHandlerCB)方法,没有任何效果。唯一对我有用的方法是process.on('uncaughtException', exitHandlerCB);,但是这个方法会导致我的Node.js应用停止。

有没有办法捕获由于对非现有主机的请求而导致错误并继续应用程序流程?

1 个答案:

答案 0 :(得分:2)

是否有任何方法可以捕获由于对非现有主机的请求而导致错误并继续应用程序流程?

是的,您需要的是在请求对象上侦听error事件。示例代码为:

let http = require('http');

let clientRequest = http.get({
  hostname: 'www.not-exist-i9io90o9i8.com',
  port: 80,
  path: '/'
}, function (res) {
  console.log(res);
});
clientRequest.on('error', function(){
  console.log('error handler');
});

//...further operation

根据Node.js http document

  

如果在请求期间遇到任何错误(使用DNS解析,TCP级别错误或实际的HTTP解析错误),则会在返回的请求对象上发出“错误”事件。与所有“错误”事件一样,如果没有注册侦听器,则会抛出错误。

在您的情况下捕获的错误是错误with DNS resolution