2012-05-27 3 views
10

Ich bin sehr neu in Node.js und ich habe ein Problem mit der Funktion node.dns.resolveNs.Node.js DNS-Lookup - wie Zeitüberschreitung einstellen?

Einige Domänen sind vollständig inaktiv und es dauert etwa eine Minute, um die Antwort zu erhalten, die normalerweise "queryNs ETIMEOUT" lautet. Gibt es eine Möglichkeit für mich, es auf einen kürzeren Zeitraum zu setzen, zum Beispiel 10 Sekunden?

+0

Suche npm Ich fand auch https://github.com/tjfontaine/node-dns, die auch Timeouts unterstützt ....? – Alfred

Antwort

19

Ich bin keine Weise sicher ein Timeout direkt auf dem Funktionsaufruf zu setzen, aber man kann einen kleinen Wrapper um den Anruf erstellen Timing selbst behandeln aus:

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

Die Ausgabe für das obige Skript :

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

Wirklich mochte ich es so sehr, ich passe es so an, dass der Rückruf generisch sein kann, und es kann eine ordentliche Methode sein, jeden Netzwerkanruf mit einem benutzerdefinierten Timeout anzurufen ... – Merc

+0

Sie müssen vorsichtig mit der Anzahl sein gleichzeitige Anfragen (da Sie sie nicht wirklich aussetzen, ist dies nur eine Emulation). – aymericbeaumet

1

Node.js dns.resolve* Verwendung c-ares-Bibliothek unter, die nativen Timeouts und verschiedene andere Optionen unterstützt. Leider stellt Node.js diese Parameter nicht zur Verfügung, aber einige von ihnen können über die Umgebungsvariable RES_OPTIONS gesetzt werden.

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

  • ndots: wie ARES_OPT_NDOTS
  • retrans: wie ARES_OPT_TIMEOUTMS
  • retry: wie ARES_OPT_TRIES
  • rotate: wie ARES_OPT_ROTATE

Siehe Mann ein res_init_options (3) für Details, was jede Option bedeutet, zum Beispiel hier http://manpages.ubuntu.com/manpages/zesty/man3/ares_init_options.3.html

Verwandte Themen