Node.js - DNS 模块



Node.js DNS 模块用于执行实际的 DNS 查找以及使用底层操作系统名称解析功能。此模块提供异步网络包装器,可以使用以下语法导入。


var dns = require("dns")

方法

方法 描述
dns.lookup(hostname[, options], callback) 将主机名(例如“google.com”)解析为第一个找到的 A (IPv4) 或 AAAA (IPv6) 记录。options 可以是对象或整数。如果未提供选项,则 IP v4 和 v6 地址均有效。如果 options 是整数,则它必须是 4 或 6。
dns.lookupService(address, port, callback) 使用 getnameinfo 将给定的地址和端口解析为主机名和服务。
dns.resolve(hostname[, rrtype], callback) 将主机名(例如“google.com”)解析为 rrtype 指定的记录类型的数组。
dns.resolve4(hostname, callback) 与 dns.resolve() 相同,但仅适用于 IPv4 查询(A 记录)。addresses 是 IPv4 地址的数组(例如 ['74.125.79.104', '74.125.79.105', '74.125.79.106'])
dns.resolve6(hostname, callback) 与 dns.resolve4() 相同,但 IPv6 查询(AAAA 查询)除外。
dns.resolveMx(hostname, callback) 与 dns.resolve() 相同,但仅适用于邮件交换查询(MX 记录)。
dns.resolveTxt(hostname, callback) 与 dns.resolve() 相同,但仅适用于文本查询(TXT 记录)。addresses 是可用于主机名的文本记录的二维数组(例如,[ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ])。每个子数组都包含一条记录的 TXT 块。根据用例,它们可以连接在一起或单独处理。
dns.resolveSrv(hostname, callback) 与 dns.resolve() 相同,但仅适用于服务记录(SRV 记录)。addresses 是可用于主机名的 SRV 记录的数组。SRV 记录的属性包括优先级、权重、端口和名称(例如,[{'priority': 10, 'weight': 5, 'port': 21223, 'name': 'service.example.com'}, ...])。
dns.resolveSoa(hostname, callback) 与 dns.resolve() 相同,但仅用于开始权限记录查询(SOA 记录)。
dns.resolveNs(hostname, callback) 与 dns.resolve() 相同,但仅适用于名称服务器记录(NS 记录)。addresses 是可用于主机名的名称服务器记录的数组(例如,['ns1.example.com', 'ns2.example.com'])。
dns.resolveCname(hostname, callback) 与 dns.resolve() 相同,但仅适用于规范名称记录(CNAME 记录)。addresses 是可用于主机名的规范名称记录的数组(例如,['bar.example.com'])。
dns.reverse(ip, callback) 反向将 IP 地址解析为主机名数组。
dns.getServers() 以字符串形式返回 IP 地址数组,这些字符串当前正用于解析。
dns.setServers(servers) 将 IP 地址数组设置为字符串,将它们设置为用于解析的服务器。

RRtypes

以下是 dns.resolve()方法使用的有效rrtypes列表 -

  • A − IPV4地址,默认
  • AAAA − IPV6地址
  • MX − 邮件交换记录
  • TXT − 文本记录
  • SRV − SRV 记录
  • PTR - 用于反向 IP 查找
  • NS - 名称服务器记录
  • CNAME − 规范名称记录
  • SOA - 权限记录的开始

错误代码

每个DNS查询都可以返回以下错误代码之一 -

  • dns.NODATA − DNS服务器返回了没有数据的答案。
  • dns.FORMERR − DNS 服务器声明查询格式错误。
  • dns.SERVFAIL − DNS服务器返回常规故障。
  • dns.NOTFOUND − 未找到域名。
  • dns.NOTIMP − DNS服务器不实现请求的操作。
  • dns.REFUSED − DNS服务器拒绝查询。
  • dns.BADQUERY − 格式错误的DNS查询。
  • dns.BADNAME − 格式错误的主机名。
  • dns.BADFAMILY − 不支持的地址系列。
  • dns.BADRESP − 格式错误的DNS回复。
  • dns.CONNREFUSED − 无法联系 DNS 服务器。
  • dns.TIMEOUT − 联系DNS服务器时超时。
  • dns.EOF − 文件结束。
  • dns.FILE − 读取文件时出错。
  • dns.NOMEM − 内存不足。
  • dns.DESTRUCTION − 频道正在被破坏。
  • dns.BADSTR − 格式错误的字符串。
  • dns.BADFLAGS − 指定的非法标志。
  • dns.NONAME − 给定的主机名不是数字。
  • dns.BADHINTS − 指定了非法提示标志。
  • dns.NOTINITIALIZED − 尚未执行 c-ares 库初始化。
  • dns.LOADIPHLPAPI − 加载iphlpapi.dll时出错。
  • dns.ADDRGETNETWORKPARAMS − 找不到 GetNetworkParams 函数。
  • dns.CANCELLED − DNS 查询已取消。

使用以下代码创建名为 main.js 的 js 文件 -


var dns = require('dns');

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

	 	 	 console.log('reverse for ' + address + ': ' + JSON.stringify(hostnames));
	 	}); 	
});

现在运行main.js以查看结果 -

$ node main.js

验证输出

address: 173.194.46.83
reverse for 173.194.46.83: ["ord08s11-in-f19.1e100.net"]