我對Node.js很陌生,使用node.dns.resolveNs函數時遇到問題。Node.js DNS查找 - 如何設置超時?
某些域完全關閉,大約需要一分鐘才能得到響應,通常是「queryNs ETIMEOUT」。有沒有辦法將它設置爲較短的時間,例如10秒?
我對Node.js很陌生,使用node.dns.resolveNs函數時遇到問題。Node.js DNS查找 - 如何設置超時?
某些域完全關閉,大約需要一分鐘才能得到響應,通常是「queryNs ETIMEOUT」。有沒有辦法將它設置爲較短的時間,例如10秒?
我不知道的任何方式直接在函數調用設置超時,但你可以創建呼叫周圍的小包裝處理超時自己:
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' ]
真的,我非常喜歡它,我正在適應它,以便回調可以是通用的,並且它可以成爲調用具有自定義超時的任何網絡呼叫的乾淨方式... – Merc
您必須小心數量併發請求(因爲你並沒有真正超時,這只是一個模擬)。 – aymericbeaumet
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_NDOTSretrans
:同ARES_OPT_TIMEOUTMSretry
:同ARES_OPT_TRIESrotate
:同ARES_OPT_ROTATE見人一個res_init_options(3)詳細說明每個選項的意思,例如這裏http://manpages.ubuntu.com/manpages/zesty/man3/ares_init_options.3.html
搜索npm我還發現https://github.com/tjfontaine/node-dns它也支持超時....? – Alfred