Node.js DNS lookup - как установить таймаут?

Я очень новичок в Node.js, и у меня проблема с использованием функции Node.dns.resolveNs.

Некоторые домены полностью опущены, и для получения ответа требуется около минуты, что обычно является "queryNs ETIMEOUT". Есть ли способ для меня установить его на более короткий период, например, 10 секунд?

Ответ 1

Я не уверен в возможности установить тайм-аут непосредственно в вызове функции, но вы можете создать небольшую оболочку вокруг вызова, чтобы обрабатывать тайминги самостоятельно:

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);
});

Выход для вышеуказанного script:

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

Ответ 2

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