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 相关文章推荐
jQuery实现原理的模拟代码 -6 代码下载
Aug 16 Javascript
jQuery应用之jQuery链用法实例
Jan 19 Javascript
javascript Array 数组常用方法
Apr 05 Javascript
JS特效实现图片自动播放并可控的效果
Jul 31 Javascript
详解javascript实现瀑布流绝对式布局
Jan 29 Javascript
原生Javascript插件开发实践
Jan 09 Javascript
基于layer.js实现收货地址弹框选择然后返回相应的地址信息
May 26 Javascript
Javascript实现时间倒计时效果
Jul 15 Javascript
Js经典案例的实例代码
May 10 Javascript
小程序中canvas的drawImage方法参数使用详解
Jul 04 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
Feb 05 Javascript
详解webpack的clean-webpack-plugin插件报错
Oct 16 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
【动漫杂谈】关于《请在T台上微笑》
2020/03/03 日漫
PHP+DBM的同学录程序(2)
2006/10/09 PHP
PHP多线程类及用法实例
2014/12/03 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
php指定长度分割字符串str_split函数用法示例
2017/01/30 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
Laravel 修改验证异常的响应格式实例代码详解
2020/05/25 PHP
jquery插件jbox使用iframe关闭问题
2009/02/09 Javascript
Js基础学习资料
2010/11/23 Javascript
js中把JSON字符串转换成JSON对象最好的方法
2014/03/21 Javascript
使用jQuery异步加载 JavaScript脚本解决方案
2014/04/20 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
详解wow.js中各种特效对应的类名
2017/09/13 Javascript
Vue.js组件间的循环引用方法示例
2017/12/27 Javascript
微信小程序数据存储与取值详解
2018/01/30 Javascript
QRCode.js二维码生成并能长按识别
2018/10/16 Javascript
Vue内部渲染视图的方法
2019/09/02 Javascript
JS实现手写 forEach算法示例
2020/04/29 Javascript
解决vue的router组件component在import时不能使用变量问题
2020/07/26 Javascript
JavaScript用document.write()输出换行的示例代码
2020/11/26 Javascript
Python isinstance判断对象类型
2008/09/06 Python
在Python中,不用while和for循环遍历列表的实例
2019/02/20 Python
Python将视频或者动态图gif逐帧保存为图片的方法
2019/09/10 Python
Java多线程实现四种方式原理详解
2020/06/02 Python
matplotlib subplot绘制多个子图的方法示例
2020/07/28 Python
印度最大的时尚购物网站:Myntra
2018/09/13 全球购物
波兰在线运动商店:YesSport
2020/07/23 全球购物
实习自我鉴定范文
2013/10/30 职场文书
尽职尽责村干部自我鉴定
2014/01/23 职场文书
青蓝工程实施方案
2014/03/27 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
催款律师函范文
2015/05/27 职场文书
教师节主持词开场白
2015/05/29 职场文书
导游词之山西-五老峰
2019/10/07 职场文书
Redis 持久化 RDB 与 AOF的执行过程
2021/11/07 Redis