Node.js DNS 模块用于解析域名。引入 DNS 模块语法格式如下:

var dns = require("dns")

方法

序号

方法 & 描述

1

dns.lookup(hostname[, options], callback)

将域名(比如 'runoob.com')解析为第一条找到的记录 A (IPV4)或 AAAA(IPV6)。参数 options可以是一个对象或整数。如果没有提供 options,IP v4 和 v6 地址都可以。如果 options 是整数,则必须是 4 或 6。

2

dns.lookupService(address, port, callback)

使用 getnameinfo 解析传入的地址和端口为域名和服务。

3

dns.resolve(hostname[, rrtype], callback)

将一个域名(如 'runoob.com')解析为一个 rrtype 指定记录类型的数组。

4

dns.resolve4(hostname, callback)

和 dns.resolve() 类似, 仅能查询 IPv4 (A 记录)。 addresses IPv4 地址数组 (比如,['74.125.79.104', '74.125.79.105', '74.125.79.106'])。

5

dns.resolve6(hostname, callback)

和 dns.resolve4() 类似, 仅能查询 IPv6( AAAA 查询)

6

dns.resolveMx(hostname, callback)

和 dns.resolve() 类似, 仅能查询邮件交换(MX 记录)。

7

dns.resolveTxt(hostname, callback)

和 dns.resolve() 类似, 仅能进行文本查询 (TXT 记录)。 addresses 是 2-d 文本记录数组。(比如,[ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ])。 每个子数组包含一条记录的 TXT 块。根据使用情况可以连接在一起,也可单独使用。

8

dns.resolveSrv(hostname, callback)

和 dns.resolve() 类似, 仅能进行服务记录查询 (SRV 记录)。 addresses 是 hostname可用的 SRV 记录数组。 SRV 记录属性有优先级(priority),权重(weight), 端口(port), 和名字(name) (比如,[{'priority': 10, 'weight': 5, 'port': 21223, 'name': 'service.example.com'}, ...])。

9

dns.resolveSoa(hostname, callback)

和 dns.resolve() 类似, 仅能查询权威记录(SOA 记录)。

10

dns.resolveNs(hostname, callback)

和 dns.resolve() 类似, 仅能进行域名服务器记录查询(NS 记录)。 addresses 是域名服务器记录数组(hostname 可以使用) (比如, ['ns1.example.com', 'ns2.example.com'])。

11

dns.resolveCname(hostname, callback)

和 dns.resolve() 类似, 仅能进行别名记录查询 (CNAME记录)。addresses 是对 hostname 可用的别名记录数组 (比如,, ['bar.example.com'])。

12

dns.reverse(ip, callback)

反向解析 IP 地址,指向该 IP 地址的域名数组。

13

dns.getServers()

返回一个用于当前解析的 IP 地址数组的字符串。

14

dns.setServers(servers)

指定一组 IP 地址作为解析服务器。

rrtypes

以下列出了 dns.resolve() 方法中有效的 rrtypes值:

  • ​'A'​​ IPV4 地址, 默认
  • ​'AAAA'​​ IPV6 地址
  • ​'MX'​​ 邮件交换记录
  • ​'TXT'​​ text 记录
  • ​'SRV'​​ SRV 记录
  • ​'PTR'​​ 用来反向 IP 查找
  • ​'NS'​​ 域名服务器记录
  • ​'CNAME'​​ 别名记录
  • ​'SOA'​​ 授权记录的初始值

错误码

每次 DNS 查询都可能返回以下错误码:

  • ​dns.NODATA​​: 无数据响应。
  • ​dns.FORMERR​​: 查询格式错误。
  • ​dns.SERVFAIL​​: 常规失败。
  • ​dns.NOTFOUND​​: 没有找到域名。
  • ​dns.NOTIMP​​: 未实现请求的操作。
  • ​dns.REFUSED​​: 拒绝查询。
  • ​dns.BADQUERY​​: 查询格式错误。
  • ​dns.BADNAME​​: 域名格式错误。
  • ​dns.BADFAMILY​​: 地址协议不支持。
  • ​dns.BADRESP​​: 回复格式错误。
  • ​dns.CONNREFUSED​​: 无法连接到 DNS 服务器。
  • ​dns.TIMEOUT​​: 连接 DNS 服务器超时。
  • ​dns.EOF​​: 文件末端。
  • ​dns.FILE​​: 读文件错误。
  • ​dns.NOMEM​​: 内存溢出。
  • ​dns.DESTRUCTION​​: 通道被摧毁。
  • ​dns.BADSTR​​: 字符串格式错误。
  • ​dns.BADFLAGS​​: 非法标识符。
  • ​dns.NONAME​​: 所给主机不是数字。
  • ​dns.BADHINTS​​: 非法HINTS标识符。
  • ​dns.NOTINITIALIZED​​: c c-ares 库尚未初始化。
  • ​dns.LOADIPHLPAPI​​: 加载 iphlpapi.dll 出错。
  • ​dns.ADDRGETNETWORKPARAMS​​: 无法找到 GetNetworkParams 函数。
  • ​dns.CANCELLED​​: 取消 DNS 查询。

实例

创建 main.js 文件,代码如下所示:

var dns = require('dns');

dns.lookup('www.github.com', function onLookup(err, address, family) {
console.log('ip 地址:', address);
dns.reverse(address, function (err, hostnames) {
if (err) {
console.log(err.stack);
}

console.log('反向解析 ' + address + ': ' + JSON.stringify(hostnames));
});
});


执行以上代码,结果如下所示:

address: 192.30.252.130
reverse for 192.30.252.130: ["github.com"]