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

und*_*ser 11 javascript node.js

参考此文档,我从console.log 代码中的域名获取 IP 地址如下所示:

const dns = require('dns');

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

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

到目前为止我尝试过的:

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

console.log(ipAddress);
Run Code Online (Sandbox Code Playgroud)

我正进入(状态:

GetAddrInfoReqWrap {
  callback: [Function],
  family: 0,
  hostname: 'www.aWebSiteName.am',
  oncomplete: [Function: onlookup] }
Run Code Online (Sandbox Code Playgroud)

hur*_*ane 15

你不能因为 dns.lookup() 函数是异步工作的。

尽管对 dns.lookup() 的调用从 JavaScript 的角度来看是异步的,但它是作为对运行在 libuv 线程池上的 getaddrinfo(3) 的同步调用来实现的。这可能会对某些应用程序产生令人惊讶的负面性能影响,请参阅 UV_THREADPOOL_SIZE 文档以获取更多信息。

有不同的方法来获取结果。欢迎来到JS世界!

打回来

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

function printResult(address){
   console.log(address);
}
Run Code Online (Sandbox Code Playgroud)

承诺

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

lookupPromise().then(res => console.log(res)).catch(err => console.error(err));
Run Code Online (Sandbox Code Playgroud)

承诺异步/等待

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

try{
    cons address = await lookupPromise();
}catch(err){
    console.error(err);
}
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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

您需要在回调中执行您的逻辑,或者创建一个帮助程序来保证函数并使用 await 在异步函数中执行它。

像这样的东西:

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");
}
Run Code Online (Sandbox Code Playgroud)

编辑:

您还可以使用:

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

async function test() {
  let data = await dnsPromises.lookup(("www.aWebSiteName.am");
}
Run Code Online (Sandbox Code Playgroud)