2012-05-27 20 views
10

Jestem bardzo nowy w Node.js i mam problem z wykorzystaniem funkcji node.dns.resolveNs.Wyszukiwanie DNS Node.js - jak ustawić limit czasu?

Niektóre domeny są całkowicie w dół, a to trwa około minuty, aby uzyskać odpowiedź, która jest zwykle „queryNs ETIMEOUT”. Czy istnieje sposób, aby ustawić go na krótszy okres, na przykład 10 sekund?

+0

wyszukiwanie npm Znalazłem również https://github.com/tjfontaine/node-dns, który obsługuje również timeouts ....? – Alfred

Odpowiedz

19

nie jestem pewny jakikolwiek sposób ustawić limit czasu bezpośrednio po wywołaniu funkcji, ale można stworzyć mały owijkę wokół wezwania do obsługi rozrządu samemu:

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

Wyjście dla powyższego scenariusza :

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

Naprawdę podobało mi się tak bardzo, jestem dostosowując ją tak, że zwrotna może mieć charakter ogólny, a to może stać się zgrabny sposób wywoływania żadnego połączenia sieciowego z niestandardowym limitu czasu ... – Merc

+0

Trzeba być ostrożnym o liczbie współbieżne żądania (ponieważ nie masz na nie czasu, to tylko emulacja). – aymericbeaumet

1

node.js dns.resolve* użycie biblioteki c-arów spodu, która wspiera limitu czasu i różne inne możliwości natywny. Niestety Node.js nie ujawnia tych zmian, ale niektóre z nich można ustawić za pomocą zmiennej środowiskowej RES_OPTIONS.

przykład: RES_OPTIONS='ndots:3 retrans:1000 retry:3 rotate' node server.js

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

Patrz człowiek za res_init_options (3) po szczegóły, co każda opcja oznacza, na przykład tutaj http://manpages.ubuntu.com/manpages/zesty/man3/ares_init_options.3.html

Powiązane problemy