如何调试神秘的ENOTFOUND?

时间:2017-10-16 12:34:09

标签: node.js

我在PM2托管nodejs集群上进行随机重启。我在错误日志中遇到的唯一症状是以下模式 - 在dns.js上的ENOTFOUND。

  

错误:getaddrinfo ENOTFOUND walkinto.inhttp walkinto.inhttp:80      在errnoException(dns.js:28:10)      在GetAddrInfoReqWrap.onlookup [as oncomplete](dns.js:76:26)

显然,问题是格式错误的服务器名称 - walkinto.inhttp 不正确,应该是 walkinto.in 。挑战在于,这不是代码中硬编码的主机名。在这个相当大的代码库中有许多地方可以进行名称解析,并且具有动态特性。

我花了相当多的时间来确定根本原因,但到目前为止还没有运气。我需要帮助从dns.js打印更多日志信息;可能一个调用堆栈'可能'将有助于前进。

Q1:如何在nodejs核心模块上启用更详细的日志记录?

Q2:ENOTFOUND会导致nodejs重启的原因是什么?如何避免重启 - 此路径不可取。

问题3:还有其他更聪明的方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

由于我们没有办法在没有代码的情况下帮助您解决问题,我会回答您的问题:

  

如何在nodejs核心模块上启用更详细的日志记录?

使用inspect选项运行节点,并使用Chrome DevTools或其他应用程序附加到调试器。请参阅以下链接:
https://nodejs.org/api/debugger.html
https://nodejs.org/en/docs/guides/debugging-getting-started/

  

对于ENOTFOUND,可能导致nodejs重启的原因是什么?如何避免重启 - 此路径不可取。

节点运行时未重新启动。您看到的错误是从类似于throw new Error(`getaddrinfo ${err}`)的内容生成的,来自throw的任何未捕获错误都会导致运行时崩溃。
重启是因为您通过PM2运行应用程序,可以通过将--no-autorestart选项传递给PM2来禁用。如果你想避免应用程序崩溃,你应该在try/catch - 块中包装可以生成的任何代码,并尝试从错误中恢复。

  

还有其他更聪明的方法可以解决这个问题吗?

这很可能不是dns stdlib模块的问题。如果我理解正确,您正在对动态生成的数据执行名称解析,这很可能是您的问题。在代码中的某处,您有一个或多个函数,这些函数要么不验证生成的数据,要么由于错误而生成无效数据。我们无法帮助您解决这个问题,因为您还没有提供任何代码。如果您可以尝试查明可能导致此问题的代码并使用它更新问题,那就太棒了。

答案 1 :(得分:0)

我在请求中遇到了这样的错误:

var optionsSearch = {
 host: 'https://mysite.sharepoint.com',
 path: '_api/search/query?querytext="sharepoint"',
  method: 'GET'
};

所有操作都是删除https://,仅保留mysite.sharepoint.com,并且此问题已解决。