You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中dns.lookup()始终返回0.0.0.0的问题求助

Node.js dns.lookup 始终返回空值(或0.0.0.0)的解决方案

问题根源

你的代码核心问题在于 dns.lookup 是异步回调函数,resolveIPV4Address 会在DNS解析完成前就返回初始值 ipv4Address(空字符串),你看到的 0.0.0.0 大概率是后续代码将空值默认填充为该地址的结果。此外,原代码中判断 address.length === 0 是错误的——dns.lookup 成功时返回的 address 是单个IP字符串(而非数组),这个判断永远不会触发。

修复方案

方案1:使用Promise+async/await(推荐生产环境)

使用Node.js提供的Promise版本DNS模块,通过async/await处理异步逻辑,确保获取到解析结果后再返回:

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

export async function resolveIPV4Address(hostname) {
  try {
    // 指定family:4确保只返回IPv4地址,避免解析出IPv6
    const { address } = await dns.lookup(hostname, { family: 4 });
    return address.toString();
  } catch (error) {
    console.error(`Error resolving host ${hostname}: ${error.message}`);
    return null; // 或抛出错误交由调用者处理
  }
}

// 调用示例(需在async函数内使用await)
(async () => {
  const ip = await resolveIPV4Address('google.com');
  console.log(ip);
})();

方案2:使用同步版lookup(仅适合简单脚本)

如果是快速测试的脚本场景,可以使用同步阻塞的dns.lookupSync,但注意这会阻塞Node.js事件循环,不适合服务端应用:

const dns = require('dns');

export function resolveIPV4Address(hostname) {
  try {
    const { address } = dns.lookupSync(hostname, { family: 4 });
    return address.toString();
  } catch (error) {
    console.error(`Error resolving host ${hostname}: ${error.message}`);
    return null;
  }
}

// 调用示例
const ip = resolveIPV4Address('google.com');
console.log(ip);

额外注意事项

  • 强制指定{ family: 4 }可以避免返回IPv6地址,符合你只获取IPv4的需求。
  • 异步函数必须通过await或.then()链式调用才能拿到结果,直接调用会返回Promise对象。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:43:18