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 必填项判断表单是否为空的方法
Sep 14 Javascript
Cookie 小记
Apr 01 Javascript
jquery实现心算练习代码
Dec 06 Javascript
JavaScript中的闭包(Closure)详细介绍
Dec 30 Javascript
jQuery使用之标记元素属性用法实例
Jan 19 Javascript
js实现右下角提示框的方法
Feb 03 Javascript
JS定时器使用,定时定点,固定时刻,循环执行详解
May 31 Javascript
JavaScript获取URL中参数querystring的方法详解
Oct 11 Javascript
JS 使用 window对象的print方法实现分页打印功能
May 16 Javascript
js实现导航跟随效果
Nov 17 Javascript
mock.js模拟前后台交互
Jul 25 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
Aug 08 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实现的获取网页中的图片并保存到本地的代码
2010/01/05 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
PHP匿名函数(闭包函数)详解
2019/03/22 PHP
Laravel 自定命令以及生成文件的例子
2019/10/23 PHP
JQuery通过Ajax提交表单并返回结果
2011/07/31 Javascript
js控制的遮罩层实例介绍
2013/05/29 Javascript
javascript阻止scroll事件多次执行的思路及实现
2013/11/08 Javascript
js清空form表单中的内容示例
2014/05/20 Javascript
Node.js 制作实时多人游戏框架
2015/01/08 Javascript
JavaScript图片轮播代码分享
2015/07/31 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
2015/12/30 Javascript
利用jQuery中的ajax分页实现代码
2016/02/25 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
微信小程序switch组件使用详解
2018/01/31 Javascript
使用react实现手机号的数据同步显示功能的示例代码
2018/04/03 Javascript
vue中element-ui表格缩略图悬浮放大功能的实例代码
2018/06/26 Javascript
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
vue-router之实现导航切换过渡动画效果
2019/10/31 Javascript
TensorFlow搭建神经网络最佳实践
2018/03/09 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
Pyside2中嵌入Matplotlib的绘图的实现
2021/02/22 Python
html5配合css3实现带提示文字的输入框(摆脱js)
2013/03/08 HTML / CSS
详解HTML5中的元素与元素
2015/08/17 HTML / CSS
前端H5 Video常见使用场景简介
2020/08/21 HTML / CSS
英国高街品牌:Miss Selfridge(塞尔弗里奇小姐)
2016/09/21 全球购物
新西兰领先的内衣店:Bendon Lingerie新西兰
2018/07/11 全球购物
挑战杯创业计划书的写作指南
2014/01/07 职场文书
《第一朵杏花》教学反思
2014/04/16 职场文书
应聘英语教师求职信
2014/04/24 职场文书
《青海高原一株柳》教学反思
2014/04/25 职场文书
2016三八妇女节校园广播稿
2015/12/17 职场文书
学生会自荐信
2019/05/16 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
利用Java设置Word文本框中的文字旋转方向的实现方法
2021/06/28 Java/Android
Win11 Beta 22621.601 和 22622.601今日发布 KB5017384修复内容汇总
2022/09/23 数码科技