Node.js中DNS模块学习总结


Posted in Javascript onFebruary 28, 2018

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' ]
});
Javascript 相关文章推荐
JavaScript中的继承方式详解
Feb 11 Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
Mar 05 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
Aug 09 Javascript
JS数组排序方法实例分析
Dec 16 Javascript
Bootstrap select多选下拉框实现代码
Dec 23 Javascript
jQuery中的一些小技巧
Jan 18 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
Apr 13 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
Jul 03 Javascript
详谈js模块化规范
Jul 07 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
Dec 08 Javascript
简单介绍react redux的中间件的使用
Apr 06 Javascript
vue-router+nginx 非根路径配置方法
Jun 30 Javascript
Vue自定义指令实现checkbox全选功能的方法
Feb 28 #Javascript
如何在vue中使用ts的示例代码
Feb 28 #Javascript
angularjs select 赋值 ng-options配置方法
Feb 28 #Javascript
select获取下拉框的值 下拉框默认选中方法
Feb 28 #Javascript
AngularJS select加载数据选中默认值的方法
Feb 28 #Javascript
基于vue-cli vue-router搭建底部导航栏移动前端项目
Feb 28 #Javascript
Vue-Router模式和钩子的用法
Feb 28 #Javascript
You might like
PHP面向对象编程快速入门
2006/10/09 PHP
基于PHP选项与信息函数的使用详解
2013/05/10 PHP
thinkphp3.2.2实现生成多张缩略图的方法
2014/12/19 PHP
php随机获取金山词霸每日一句的方法
2015/07/09 PHP
JQuery 无废话系列教程(二) jquery实战篇上
2009/06/23 Javascript
silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
2011/08/09 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
通过伪协议解决父页面与iframe页面通信的问题
2015/04/05 Javascript
JavaScript实现DIV层拖动及动态增加新层的方法
2015/05/12 Javascript
js+html5绘制图片到canvas的方法
2015/06/05 Javascript
jQuery模仿阿里云购买服务器选择购买时间长度的代码
2016/04/29 Javascript
Jquery ui datepicker设置日期范围,如只能隔3天【实现代码】
2016/05/04 Javascript
jQuery表单验证插件解析(推荐)
2016/07/21 Javascript
Google 地图事件实例讲解
2016/08/06 Javascript
vue组件表单数据回显验证及提交的实例代码
2018/08/30 Javascript
vue 刷新之后 嵌套路由不变 重新渲染页面的方法
2018/09/13 Javascript
微信小程序按钮点击动画效果的实现
2019/09/04 Javascript
python快速排序代码实例
2013/11/21 Python
python解析html提取数据,并生成word文档实例解析
2018/01/22 Python
python实现定时自动备份文件到其他主机的实例代码
2018/02/23 Python
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
python 字典的打印实现
2019/09/26 Python
对Pytorch中Tensor的各种池化操作解析
2020/01/03 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
2020/06/02 Python
python virtualenv虚拟环境配置与使用教程详解
2020/07/13 Python
Python 删除List元素的三种方法remove、pop、del
2020/11/16 Python
python dir函数快速掌握用法技巧
2020/12/09 Python
中专生自荐信
2013/10/12 职场文书
小学生防溺水广播稿
2014/01/12 职场文书
学校宣传标语
2014/06/18 职场文书
企业挂职心得体会
2014/09/10 职场文书
自主招生自荐信格式范文
2015/03/25 职场文书
上课讲话检讨书范文
2015/05/07 职场文书
《曾国藩家书》读后感——读家书,立家风
2019/08/21 职场文书
关于Redis的主从复制及哨兵问题
2022/06/16 Redis