2012-05-27 16 views
10

Soy muy nuevo en Node.js y tengo un problema al utilizar la función node.dns.resolveNs.Búsqueda DNS de Node.js: cómo configurar el tiempo de espera?

Algunos dominios están completamente inactivos y se tarda aproximadamente un minuto en obtener la respuesta, que suele ser "queryNs ETIMEOUT". ¿Hay alguna manera de configurarlo en un período más corto, por ejemplo, 10 segundos?

+0

buscando npm También encontré https://github.com/tjfontaine/node-dns, que también admite tiempos de espera ...? – Alfred

Respuesta

19

No estoy seguro de cualquier forma de establecer un tiempo de espera directamente en la llamada a la función, pero se puede crear un pequeño envoltorio alrededor de la llamada para manejar el tiempo de espera a ti mismo:

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

La salida de la secuencia de comandos :

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

Realmente, me gustó tanto, lo estoy adaptando para que la devolución de llamada pueda ser genérica, y puede convertirse en una forma ordenada de llamar a cualquier llamada de red con un tiempo de espera personalizado ... – Merc

+0

Tiene que tener cuidado con el número de solicitudes simultáneas (ya que realmente no las agota, esto es solo una emulación). – aymericbeaumet

1

Node.js dns.resolve* uso de la biblioteca c-ares debajo, que es compatible con los tiempos de espera y varias otras opciones de forma nativa. Lamentablemente, Node.js no expone esos parámetros optimizables, pero algunos de ellos se pueden configurar a través de la variable de entorno RES_OPTIONS.

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

  • ndots: lo mismo que ARES_OPT_NDOTS
  • retrans: lo mismo que ARES_OPT_TIMEOUTMS
  • retry: lo mismo que ARES_OPT_TRIES
  • rotate: lo mismo que ARES_OPT_ROTATE

Ver hombre un res_init_options (3) para más detalles de lo que significa cada opción, por ejemplo aquí http://manpages.ubuntu.com/manpages/zesty/man3/ares_init_options.3.html

Cuestiones relacionadas