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

Javascript Node.js DNS查找-如何设置超时?,javascript,node.js,dns,Javascript,Node.js,Dns,我是Node.js的新手,在使用Node.dns.resolveNs函数时遇到了问题 有些域完全关闭,需要大约一分钟才能得到响应,通常是“queryNs-ETIMEOUT”。是否有一种方法可以将其设置为较短的时间段,例如10秒 我不确定是否有任何方法可以直接在函数调用上设置超时,但您可以在调用周围创建一个小包装器来自行处理超时: var dns = require('dns'); var nsLookup = function(domain, timeout, callback) { va

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


有些域完全关闭,需要大约一分钟才能得到响应,通常是“queryNs-ETIMEOUT”。是否有一种方法可以将其设置为较短的时间段,例如10秒

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

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' ]

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

示例:
RES\u OPTIONS='ndots:3次重试:1000次重试:3次旋转'node server.js

  • ndots
    :与战神相同
  • 重传
    :与ARES\u OPT\u超时相同
  • 重试
    :与ARES\u OPT\u尝试相同
  • 旋转
    :与ARES_OPT_旋转相同

请参阅man ares_init_options(3)以了解每个选项的详细含义,例如,这里的查找也很好

我们开发了一个模块来替换/扩展节点的
dns.lookup
方法。主要目标是绕过线程池阻塞的问题。所以模块缓存响应,具有多记录解析和TTL支持。此外,我们有良好的单位和功能。模块在生产和高负载环境中进行了测试。在麻省理工学院的许可下

这是:


我相信这会有帮助的

基于@redbaron的答案,您可以在运行时设置RES_OPTIONS变量,以设置dns使用的c-ares库的超时。resolve*:

//这将超时(1000*3*2)毫秒
process.env.RES_OPTIONS='ndots:3次重试:1000次重试:3次轮换';

搜索npm时,我还发现它也支持超时…?真的,我非常喜欢它,我正在调整它,以便回调可以是通用的,并且它可以成为使用自定义超时调用任何网络调用的一种简洁方式…您必须小心并发请求的数量(因为您没有真正超时,这只是一个模拟)。这应该被标记为最佳答案。谢谢@redbaron!调整此参数将我的AWS lambda执行时间从~5分钟减少到了30秒。