2012-05-27 34 views
10

Node.js için çok yeni ve node.dns.resolveNs işlevini kullanarak bir sorun yaşıyorum.Node.js DNS araması - zaman aşımı nasıl ayarlanır?

Bazı alanlar tamamen kapalı ve genellikle "queryN ETIMEOUT" olan yanıtı almak yaklaşık bir dakika alır. 10 saniyeliğine daha kısa bir süreye ayarlamanın bir yolu var mı?

+0

npm aramasında ayrıca zaman aşımlarını da destekleyen https://github.com/tjfontaine/node-dns adresini de bulabilirsiniz ....? – Alfred

cevap

19

ben işlev çağrısı üzerine doğrudan bir zaman aşımı ayarlamak için herhangi bir yolu emin değilim, ama kendini aşımından işlemek için çağrı etrafında küçük bir sarmalayıcı oluşturabilirsiniz:

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

yukarıdaki komut dosyası için çıkış : doğal zaman aşımları ve diğer çeşitli seçenekleri destekler altına

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

Gerçekten çok hoşuma gitti, geri bildirimin genel olabileceği şekilde uyarladım ve herhangi bir ağ çağrısını özel bir zaman aşımı ile çağırmak için düzgün bir yol olabilir ... – Merc

+0

Eşzamanlı istekler (onları gerçekten zaman aşımına uğramadığınızdan, bu sadece bir emülasyon). – aymericbeaumet

1

node.js dns.resolve* kullanım c-ares kütüphanesi. Ne yazık ki, Node.js bu tünelleri açığa çıkarmaz, ancak bazılarının RES_OPTIONS ortam değişkeni ile ayarlanması mümkündür.

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

  • ndots: Aynı ARES_OPT_NDOTS
  • retrans olarak: Aynı şekilde ARES_OPT_TIMEOUTMS
  • retry: Aynı şekilde ARES_OPT_TRIES
  • rotate: Aynı şekilde ARES_OPT_ROTATE

bakınız erkek bir her seçeneğin ne anlama geldiğini öğrenmek için res_init_options (3), örneğin http://manpages.ubuntu.com/manpages/zesty/man3/ares_init_options.3.html

İlgili konular