2012-05-27 42 views
10

我對Node.js很陌生,使用node.dns.resolveNs函數時遇到問題。Node.js DNS查找 - 如何設置超時?

某些域完全關閉,大約需要一分鐘才能得到響應,通常是「queryNs ETIMEOUT」。有沒有辦法將它設置爲較短的時間,例如10秒?

+0

搜索npm我還發現https://github.com/tjfontaine/node-dns它也支持超時....? – Alfred

回答

19

我不知道的任何方式直接在函數調用設置超時,但你可以創建呼叫周圍的小包裝處理超時自己:

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

的輸出上面的腳本:

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

真的,我非常喜歡它,我正在適應它,以便回調可以是通用的,並且它可以成爲調用具有自定義超時的任何網絡呼叫的乾淨方式... – Merc

+0

您必須小心數量併發請求(因爲你並沒有真正超時,這只是一個模擬)。 – aymericbeaumet

1

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

見人一個res_init_options(3)詳細說明每個選項的意思,例如這裏http://manpages.ubuntu.com/manpages/zesty/man3/ares_init_options.3.html