Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用dns.lookup()node.js按域获取ip地址_Javascript_Node.js - Fatal编程技术网

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

Javascript 使用dns.lookup()node.js按域获取ip地址,javascript,node.js,Javascript,Node.js,我从控制台内的域名获取ip地址。log 代码如下所示: const dns = require('dns'); dns.lookup('iana.org', (err, address, family) => { console.log('address: %j family: IPv%s', address, family); }); console.log的输出正常。 然而,我无法获得该范围之外的地址。dns.lookup函数的返回语句是一个对象 到目前为止,我所尝试的: co

我从控制台内的域名获取ip地址。log 代码如下所示:

const dns = require('dns');

dns.lookup('iana.org', (err, address, family) => {
  console.log('address: %j family: IPv%s', address, family);
});
console.log的输出正常。 然而,我无法获得该范围之外的地址。
dns.lookup
函数的返回语句是一个对象

到目前为止,我所尝试的:

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] }
这是正常的,因为“dns.lookup”是异步执行的

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

您需要在回调中执行逻辑,或者让助手提示函数,并使用wait在异步函数中执行它

大概是这样的:

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");
}

dns查找是异步进行的,可以在启动回调时设置该值。您只到达回调中有地址的点。在其周围放置一个变量不会等待回调启动,因此它将不可用

dns.lookup(“www.aWebSiteName.am”,(错误、地址、家族)=>{
如果(错误)抛出错误;
//在这里您可以访问变量地址
//执行需要此处地址的代码或调用函数
});

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

尽管对dns.lookup()的调用将与JavaScript的 透视图中,它被实现为对getaddrinfo(3)的同步调用 在libuv的线程池上运行。这可能产生令人惊讶的负面影响 对于某些应用程序的性能影响,请参阅 有关详细信息,请参阅UV_线程池大小文档

有不同的方法来取得结果。欢迎来到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) 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) reject(err);
            resolve(address);
        });
   });
};

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

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

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

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

最初,我的解决方案给出了一个正确/错误的答案。正如你在问题中所问的那样,我对它进行了修改以返回地址

这是我个人的实现

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()语句只是为了快速测试脚本