Node.js DNS 响应延迟
Posted
技术标签:
【中文标题】Node.js DNS 响应延迟【英文标题】:Node.js DNS response delayed 【发布时间】:2012-08-27 18:30:43 【问题描述】:我只是想连接一个包含 DNS 解析结果域的数组。
这是我的代码:
var ipList = [];
for(var j=0; j < addressList.length; j++)
dns.resolve(addressList[j], function(error, ipRange)
if(error !== null)
console.log('The DNS request failed.');
console.log('--1--');
console.log(ipRange);
console.log('--2--');
ipList.concat(ipRange);
);
console.log(ipList);
我得到的结果是这样的:
[]
--1--
[ '173.194.35.144',
'173.194.35.145',
'173.194.35.146',
'173.194.35.147',
'173.194.35.148' ]
--2--
看起来 DNS 解析响应在 concat()
之后到达,就像它被延迟了一样。
这意味着 ipList 是一个空数组。
谁能帮我解决这个问题? 提前致谢!
【问题讨论】:
【参考方案1】:resolve 是异步的,因此在您进行最终打印时并未完成。使用同步 DNS(不能立即为 node.js 找到这个),或者正确安排你的回调。
【讨论】:
该死的,我还以为会是这样。可悲的是我不知道如何解决它...... @AwakeZoldiek,您可以尝试递归(如果 addressList 永远不会长,则传入调用console.log(ipList);
的回调。
我不太明白你的意思。可以举个例子吗?
@AwakeZoldiek 真正了解 javascript 的单线程特性,需要process.nextTick
howtonode.org/understanding-process-next-tick
@AwakeZoldiek github.com/caolan/async async 模块也在使用process.nextTick
【参考方案2】:
您可以执行类似的操作,跟踪未完成的 DNS 查询数量,以便了解完整集何时可用:
var ipList = [], count = addressList.length;
for(var j=0; j < addressList.length; j++)
dns.resolve(addressList[j], function(error, ipRange)
if(error !== null)
console.log('The DNS request failed.');
else
ipList.push(ipRange);
if (--count === 0)
// All DNS queries are complete.
console.log(ipList);
);
【讨论】:
您的ipList.concat
呼叫应改为 ipList.push
。我更新了我的帖子。
哦,是的,完全错过了。现在一切正常。感谢您的快速回答!以上是关于Node.js DNS 响应延迟的主要内容,如果未能解决你的问题,请参考以下文章
Node.JS 中的简单 DNS 服务器? (主要/权威 DNS 服务器)(也许是 ndns?)