[英]get ip address by domain with dns.lookup() 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);
});
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() 函数是异步工作的。
尽管对 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);
}
承诺
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”是异步执行的
所以你不能只使用函数的返回值
您需要在回调中执行您的逻辑,或者创建一个帮助程序来保证函数并使用 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");
}
编辑:
您还可以使用:
const dns = require('dns');
dnsPromises = dns.promises;
async function test() {
let data = await dnsPromises.lookup(("www.aWebSiteName.am");
}
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
});
即使这是一个老问题,我也想表达我对你的看法。
搜索 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() 语句只是为了快速测试脚本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.