欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Node.js中DNS模块学习总结

程序员文章站 2022-04-21 08:41:39
1. dns 在node.js中,提供dns模块,以实现域名查找及域名解析的处理。 在dns模块中,提供了三个主方法及一系列便捷方法。 resolve...

1. dns

在node.js中,提供dns模块,以实现域名查找及域名解析的处理。

  • 在dns模块中,提供了三个主方法及一系列便捷方法。
  • resolve方法:用于将一个域名解析为一组dns记录。
  • reverse方法: 用于将ip地址转换为一组域名。
  • lookup方法: 用于将一个域名转换成ip地址。
  • dns模块中的其余便捷方法均为resolve方法的一种便捷形式。

2. 使用resolve方法将域名解析为dns记录

`dns.resolve(domain, [rrtype], callback(err, address){...})`

domain参数为一个字符串,用于指定需要被解析的域名,可以包括子域名。
rrtypr参数为一个字符串,用于指定需要获取的记录类型,可指定的记录类型如下。

  • a,该参数值为默认值,当记录类型为a时,该记录将一个ipv4地址映射为一个域名。
  • aaaa,当记录类型为aaaa时,该记录将一个ipv6地址映射为一个域名。
  • cname,当记录类型为cname时,表示该记录为一个域名的别名记录,例如,一个www.example.com域名记录也许为一个example.com域名记录额别名记录。
  • mx,mx记录指向一个使用smtp的域中的邮件服务器,例如,当你想person@domain.com邮件地址发送电子邮件时,domain.com域的mx记录中保存了发送该邮件时的邮件服务器地址。
  • txt,txt记录是为该域名附加的描述记录。
  • srv,srv记录用于为一个特定域中所有可用服务提供信息。
  • ptr,ptr记录用于反向地址解析,该记录将一个域名映射为一个ipv4地址。
  • ns,ns(name server)记录是域名服务器记录,用来指定该域名由哪个dns服务器进行解析。

回调函数有两个参数,err是域名解析失败时触发的错误对象,addresses参数为一个数组,其中存放了所有获取到的dns记录。

3. 为resolve方法定制的各种便捷方法

  • dns.resolve4(domain, callback),获取ipv4地址
  • dns.resolve6(domain, callback),获取ipv6地址
  • dns.resolvemx(domain, callback),获取mx记录,邮件交换服务器记录
  • dns.resolvetxt(domain, callback),获取txt记录,域名附加的描述记录
  • dns.resolvesrv(domain, callback),获取srv记录,服务记录
  • dns.resolvens(domain, callback),获取ns记录,域名服务器记录
  • dns.resolvecname(domain, callback),获取别名记录

4. 使用lookup方法查询ip地址

当使用resolve4方法或者resolve6方法时,由于callback参数值回调函数中的addresses参数值数组中存放着所有获取到的ipv4地址或ipv6地址。因此dns模块中提供了一个获取第一个被发现的ipv4地址或者ipv6地址的lookup方法

`dns.lookup(domain, [family], callback(err, addresses, family){...})`

  • domain参数为一个字符串,用于指定需要解析的域名
  • family参数值为一个整数值,用于指定需要获取的ip地址类型,可指定的参数值为4或6,默认参数值为null,表示既可以获取ipv4,又可以获取ipv6
  • 回调函数err参数值为获取地址失败时触发的错误对象,当域名不存在或查询失败时该错误对象的code属性值为enoent
  • addresses参数值为一个字符串,为获取到的ip地址
  • family参数值为4时,表示为一个ipv4地址,为6时,表示为一个ipv6地址。

5. 使用reverse方法反向解析ip地址

在dns模块中,使用reverse方法将一个ip地址反向解析为一组与该ip地址绑定的域名

`dns.reverse(ip, callback(err, domains){...})`

  • ip参数值为一个字符串,用于指定需要解析的ip地址
  • 回调函数的err为反向解析地址失败后的错误对象
  • domains参数值为一个数组,存放了所有获取到的域名

6. dns模块中的各种错误代码

err参数值为执行各种解析或反向解析操作时触发的错误对象,可根据该错误对象的code属性值,即触发的错误代号判断出发了什么错误

  • enodata:dns服务器返回一个没有数据的查询结果
  • eformerr:dns服务器发现客户端请求查询时使用了格式错误的查询参数
  • eservfail:dns服务器执行查询操作失败
  • enotfound:未发现任何域名
  • enotimp:dns服务器不能进行客户端所请求的查询操作
  • erefused:dns服务器拒绝进行查询操作
  • ebadquery:格式错误的dns查询
  • ebadname:域名格式错误
  • ebadfamily:不支持的ip地址类型
  • ebadresp:dns答复的格式错误
  • econnrefused:不能建立与dns服务器之间的连接
  • etimeout:与dns服务器之间建立连接超时
  • eeof:已到达文件底部
  • efile:读取文件失败
  • enomem:没有足够的内存空间
  • edestruction:通道已经被销毁
  • ebadstr:字符串格式错误
  • ebadflags:指定了错误的判断标志
  • enoname:指定的主机名不是数值格式的
  • ebadhints:指定的提示标志无效
  • enotinitialized:c-ares类库初始化工作尚未完成
  • eloadiphlpapi:加载iphlpapi.dll时触发了一个错误
  • eaddregetnetworkparams:未发现getnetworkparams函数
  • ecancelled:dns查询操作被取消

7. dns模块的基本使用

const dns = require('dns');
let url = 'www.qq.com';

dns.resolve(url, 'a', (err, addresses) => {
  console.log(addresses);
  // ipv4地址 [ '103.7.30.123' ]
});

dns.resolve(url, 'aaaa', (err, addresses) => {
  console.log(addresses);
  // ipv6地址 [ '240e:e1:8100:28::2:16' ]
});
dns.resolvemx('qq.com', (err, addresses) => {
  console.log(addresses);
  // 邮件交换服务器记录
  // [ { exchange: 'mx2.qq.com', priority: 20 },
  //  { exchange: 'mx1.qq.com', priority: 30 },
  //  { exchange: 'mx3.qq.com', priority: 10 } ]
  
});

dns.resolvetxt('qq.com', (err, addresses) => {
  console.log(addresses);
  // 域名附加的描述记录
  // [ [ 'v=spf1 include:spf.mail.qq.com -all' ] ]
});

dns.resolvesrv('www.baidu.com', (err, addresses) => {
  console.log(addresses);
  // 服务记录
  // []
});

dns.resolvens('www.github.com', (err, addresses) => {
  console.log(addresses);
  // 域名服务器记录
  // [ 'ns-421.awsdns-52.com',
  // 'ns-520.awsdns-01.net',
  // 'ns1.p16.dynect.net',
  // 'ns2.p16.dynect.net',
  // 'ns3.p16.dynect.net',
  // 'ns4.p16.dynect.net',
  // 'ns-1283.awsdns-32.org',
  // 'ns-1707.awsdns-21.co.uk' ]
});

dns.resolvecname('www.163.com', (err, addresses) => {
  console.log(addresses);
  // 获取别名记录
  // [ 'www.163.com.lxdns.com' ]
});


dns.lookup('google.com', 4, (err, address, family) => {
  // 查询ip地址
  // address,查询到的地址
  // family,ipv4或ipv6
  console.log(address);// 172.217.27.142
  console.log(family);// 4
});

dns.lookup('google.com', 6, (err, address, family) => {
  console.log(address);// 2404:6800:4008:803::200e
  console.log(family);// 6
});

dns.reverse('203.188.200.67', (err, domain) => {
  // 反向解析ip地址
  console.log(domain);
  // [ 'media-router-fp1.prod.media.vip.tp2.yahoo.com' ]
});