如何在节点js中将主机名解析为IP地址

How to resolve hostname to an ip address in node js

我需要将 hosts 文件中定义的主机名解析为其对应的 IP 地址。

例如我的主机文件看起来像这样 - “/etc/hosts”

127.0.0.1    ggns2dss81 localhost.localdomain localhost
::1     localhost6.localdomain6 localhost6
192.168.253.8    abcdserver
192.168.253.20   testwsserver

现在在我的 node.js 中,我可以读取该文件的内容,但我需要获取给定的 hostname

hostname = "testwsserver"
hostIP = getIP(hostname);
console.log(hostIP); // This should print 192.168.253.20

PS - npm pkg 或任何第三方包无法安装在机器上。

非常感谢帮助!!

怎么样NodeJS documentation - DNS – 你检查了吗?

const dns = require('dns')

dns.lookup('testwsserver', function(err, result) {
  console.log(result)
})

仅以 Krzysztof Safjanowski 的回答为基础,

您还可以使用内置 promisify 实用程序将其转换为承诺而不是回调。

const util = require('util');
const dns = require('dns');
const lookup = util.promisify(dns.lookup);

try {
  result = await lookup('google.com')
  console.log(result)
} catch (error) {
  console.error(error)
}

这是一个使用标准 modules, promises, and async/await 的示例:

import { default as dns } from 'dns';

async function getIP(hostname)
{
    let obj = await dns.promises.lookup(hostname).catch((error)=>
    {
        console.error(error);
    });
    return obj?.address;
}

async function main()
{
    let hostname = "whosebug.com";
    let hostIP = await getIP(hostname);
    console.log(`IP Address of ${hostname}:`, hostIP);
}
main();

您将其保存到以扩展名 mjs 而不是 js 结尾的文件中,这样节点就会知道我们正在使用 ES6 模块的 import 语句而不是commonJS require 语句。