如何将dns.lookup的返回值存储在变量中?如果我将其存储在数组中,它将显示为空白。
以下是我正在处理的代码:
const dns = require('dns');
class Network
{
search(host)
{
let options = {
hints: dns.ADDRCONFIG | dns.V4MAPPED,
all: true,
verbatim: true
}
let addr = [];
dns.lookup(host, options, (error, address) =>
{
if(error)
{
console.log("Could not resolve %s\n", host);
console.log(error);
}
address.forEach(ip => {
addr.push({
address: ip.address,
family: ip.family
});
});
});
console.log(addr);
return addr;
}
}
const network = new Network();
let output = network.search("www.google.com");
console.log(output);
代码的输出为空白,即[]
请提出补救措施。
谢谢
答案 0 :(得分:0)
dns.lookup
的最后一个参数必须是您已经注意到的回调。该方法是异步的,但此行return addr;
不是-在填充之前返回addr。
可以将search
的方法定义更改为将使用dns.lookup
的结果调用的回调作为第二个参数。
像这样:
search(host, done) {
...
dns.lookup(host, options, (err, addresses) => {
...
const finalAddresses = [];
addresses.forEach((ip) => {
finalAddresses.push({
address: ip.address,
family: ip.family
});
});
done(null, finalAddresses);
});
}
const network = new Network();
network.search("www.google.com", (err, result) => {
if (err) {
return console.log(err);
}
console.log(result);
});
答案 1 :(得分:0)
我建议同时使用async/await语法和非常有用的util.promisify函数。
这使我们的代码更加紧凑,也使您可以以与同步代码非常相似的方式编写代码。
然后,我们将使用一些destructuring仅选择我们感兴趣的地址对象中的属性。
const dns = require('dns');
const promisify = require('util').promisify;
class Network
{
async search(host)
{
let options = {
hints: dns.ADDRCONFIG | dns.VMAPPED,
all: true,
verbatim: true
}
let address = await promisify(dns.lookup)(host, options);
return address.map( ({address, family}) => {
return { address, family };
});
}
}
async function testSearch() {
const network = new Network();
let output = await network.search("www.google.com");
console.log(output);
}
testSearch();