26. DNS 模块

Node.js dns模块用于执行实际的DNS查找以及使用基础操作系统名称解析功能。

此模块提供异步网络包装,可以使用以下语法导入。var dns = require("dns")

26.1. 方法

  • 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记录)。 地址是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记录)。 地址是可用于主机名的文本记录的二维数组(例如 [[‘v = spf1 ip4:0.0.0.0’,’~all’]] )。 每个子数组包含一个记录的TXT块。 根据使用情况,它们可以连接在一起或单独处理。
  • dns.resolveSrv(hostname, callback):与 dns.resolve() 相同,但仅适用于服务记录(SRV记录)。 地址是可用于主机名的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记录)。 地址是可用于主机名的名称服务器记录的数组(例如 [‘ns1.example.com’,’ns2.example.com’])。
  • dns.resolveCname(hostname, callback):与 dns.resolve() 相同,但仅适用于规范名称记录(CNAME记录)。 地址是可用于主机名的规范名称记录的数组(例如 [‘bar.example.com’])。
  • dns.reverse(ip, callback):反向将IP地址解析为主机名数组。
  • dns.getServers():返回一个IP地址数组,作为当前用于解析的字符串。
  • dns.setServers(servers):给定一组IP地址作为字符串,将它们设置为用于解析的服务器。

26.2. rrtypes

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

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

26.3. 错误代码

每个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查询已取消。

26.4. 示例

使用以下代码创建名为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"]
下一节:Node.js domain模块用于拦截未处理的错误。 可以使用内部绑定或外部绑定拦截这些未处理的错误。 如果根本没有处理错误,那么它们只会使Node应用程序崩溃。