使用dns.lookup()node.js按域获取IP地址

时间:2019-02-26 13:50:24

标签: javascript node.js

引用this documentation,我从console.log内的域名获取IP地址。 代码看起来像这样:

const dns = require('dns');

dns.lookup('iana.org', (err, address, family) => {
  console.log('address: %j family: IPv%s', address, family);
});

console.log的输出很好。 但是,我无法获得该范围之外的地址。 dns.lookup函数的return语句是一个对象。

到目前为止,我已经尝试过:

const ipAddress = dns.lookup("www.aWebSiteName.am", (err, address, family) => {
  if(err) throw err;
  return address;
});

console.log(ipAddress);

我得到:

GetAddrInfoReqWrap {
  callback: [Function],
  family: 0,
  hostname: 'www.aWebSiteName.am',
  oncomplete: [Function: onlookup] }

4 个答案:

答案 0 :(得分:3)

这是正常现象,因为“ dns.lookup”是异步执行的

所以您不能只使用函数的返回值

您需要在回调内部进行逻辑处理,或者创建一个助手以使函数混杂,并在等待时在异步函数中执行。

类似这样的东西:

function lookup(domain) {
  return new Promise((resolve, reject) => {
    dns.lookup(address, (err, address, family) => {
      if (err) {
        reject(err)
      } else {
        resolve({ address, family })
      }
    })
  })
}

async function test() {
  let ipAddress = await lookup(("www.aWebSiteName.am");
}

编辑:

您还可以使用:

const dns = require('dns');
dnsPromises = dns.promises;

async function test() {
  let data = await dnsPromises.lookup(("www.aWebSiteName.am");
}

答案 1 :(得分:2)

不能这样做,因为dns.lookup()函数正在异步工作。

  

尽管对dns.lookup()的调用将与JavaScript的异步   角度来看,它实现为对getaddrinfo(3)的同步调用   在libuv的线程池上运行。这可能会有令人惊讶的负面影响   对于某些应用程序的性能影响,请参见   有关更多信息,请参见UV_THREADPOOL_SIZE文档。

有多种方法可以得出结果。欢迎来到JS世界!

回调

dns.lookup("www.aWebSiteName.am", (err, address, family) => {
  if(err) throw err;
  printResult(address);
});

function printResult(address){
   console.log(address);
}

承诺

const lookupPromise = new Promise((resolve, reject) => {
    dns.lookup("www.aWebSiteName.am", (err, address, family) => {
        if(err) throw reject(err);
        resolve(address);
    });
});

lookupPromise().then(res => console.log(res)).catch(err => console.error(err));

承诺异步/等待

async function lookupPromise(){
    return new Promise((resolve, reject) => {
        dns.lookup("www.aWebSiteName.am", (err, address, family) => {
            if(err) throw reject(err);
            resolve(address);
        });
   });
};

try{
    cons address = await lookupPromise();
}catch(err){
    console.error(err);
}

答案 2 :(得分:0)

dns查找异步发生,并且可以在触发回调时设置该值。您只能到达回调中具有地址的位置。将变量放在该变量周围将不会等待回调触发,因此将不可用。

dns.lookup("www.aWebSiteName.am", (err, address, family) => {
  if(err) throw err;
   // Here you have access to the variable address
   // Execute code or call function which needs the address here
});

答案 3 :(得分:0)

即使这是一个老问题,我也想表达我对你的看法。

搜索 dns.lookup() 函数的示例时,我总是发现它们在 .lookup 方法中报告了一些 console.log() 输出。

但我一直在寻找一个简单的真/假响应值。 类似于:我有这个网址,请检查它是否在互联网上。

最初我的解决方案给出了一个真/假。正如您在问题中所问的那样,我对其进行了修改以返回地址。

这是我个人的实现。

async function getAddr(href) {
  console.log("Check =>", href);
  let resVal = undefined;
  await dns.lookup( new URL(href).host , (err, address, family) => {
    return resVal = (err) ? false : address;
  });

  await new Promise((resolve, reject) => setTimeout(resolve, 1000));
  console.log("Check =>", href, "is host Good? [", resVal, "]");
  return resVal;
}

我认为这是管理个性化答案的最简单方法。无论您有什么需求,都可以立即进行调整和个性化。

我保留了 console.log() 语句只是为了快速测试脚本。