Node.js DNS查找 - 如何设置超时?

时间:2012-05-27 22:13:16

标签: javascript node.js dns

我是Node.js的新手,我在使用node.dns.resolveNs函数时遇到了问题。

某些域名完全关闭,获得响应大约需要一分钟,通常是“queryNs ETIMEOUT”。有没有办法让我把它设置得更短,例如10秒?

4 个答案:

答案 0 :(得分:21)

我不确定是否有任何方法可以直接在函数调用上设置超时,但您可以在调用周围创建一个小包装器以自行处理超时:

var dns = require('dns');

var nsLookup = function(domain, timeout, callback) {
  var callbackCalled = false;
  var doCallback = function(err, domains) {
    if (callbackCalled) return;
    callbackCalled = true;
    callback(err, domains);
  };

  setTimeout(function() {
    doCallback(new Error("Timeout exceeded"), null);
  }, timeout);

  dns.resolveNs(domain, doCallback);
};

nsLookup('stackoverflow.com', 1000, function(err, addresses) {
  console.log("Results for stackoverflow.com, timeout 1000:");
  if (err) {
    console.log("Err: " + err);
    return;
  }
  console.log(addresses);
});

nsLookup('stackoverflow.com', 1, function(err, addresses) {
  console.log("Results for stackoverflow.com, timeout 1:");
  if (err) {
    console.log("Err: " + err);
    return;
  }
  console.log(addresses);
});

上述脚本的输出:

Results for stackoverflow.com, timeout 1:
Err: Error: Timeout exceeded
Results for stackoverflow.com, timeout 1000:
[ 'ns1.serverfault.com',
  'ns2.serverfault.com',
  'ns3.serverfault.com' ]

答案 1 :(得分:4)

Node.js dns.resolve*使用下面的c-ares库,它本身支持超时和各种其他选项。遗憾的是,Node.js不公开这些可调参数,但其中一些可以通过RES_OPTIONS环境变量进行设置。

示例:RES_OPTIONS='ndots:3 retrans:1000 retry:3 rotate' node server.js

  • ndots:与ARES_OPT_NDOTS相同
  • retrans:与ARES_OPT_TIMEOUTMS
  • 相同
  • retry:与ARES_OPT_TRIES相同
  • rotate:与ARES_OPT_ROTATE相同

请参阅man ares_init_options(3)了解每个选项的含义,例如http://manpages.ubuntu.com/manpages/zesty/man3/ares_init_options.3.html

答案 2 :(得分:0)

也很高兴知道该查询may block your application

我们开发了一个替换/扩展节点的dns.lookup方法的模块。主要目标是绕过阻塞线程池的问题。因此,模块缓存响应,具有多记录解析和TTL支持。此外,我们还具有良好的单元和功能tests with 100% coverage。模块已在生产和高负载环境中进行了测试。在MIT许可下。

这里是:https://github.com/LCMApps/dns-lookup-cache

我相信这可能会有所帮助!

答案 3 :(得分:0)

根据@redbaron 的回答,您可以在运行时设置 RES_OPTIONS 变量来设置 dns.resolve* 使用的 c-ares 库的超时时间:

// this will timeout for (1000 * 3 * 2) ms
process.env.RES_OPTIONS='ndots:3 retrans:1000 retry:3 rotate';