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 相关文章推荐
js 获取元素下面所有li的两种方法
Apr 14 Javascript
jQuery获得指定元素坐标的方法
Apr 14 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
Apr 22 Javascript
js实现兼容IE和FF的上下层的移动
May 04 Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
Jun 01 Javascript
jQuery实现响应鼠标滚动的动感菜单效果
Sep 21 Javascript
举例讲解JavaScript中关于对象操作的相关知识
Nov 16 Javascript
微信小程序 教程之wxapp视图容器 scroll-view
Oct 19 Javascript
让微信小程序支持ES6中Promise特性的方法详解
Jun 13 Javascript
Taro集成Redux快速上手的方法示例
Jun 21 Javascript
vue2.0结合Element-ui实战案例
Mar 06 Javascript
JQuery样式与属性设置方法分析
Dec 07 jQuery
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
基于PHP5魔术常量与魔术方法的详解
2013/06/13 PHP
php中file_get_content 和curl以及fopen 效率分析
2014/09/19 PHP
php基于GD库画五星红旗的方法
2015/02/24 PHP
PHP中的魔术方法总结和使用实例
2015/05/11 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
PHP中上传文件打印错误错误类型分析
2019/04/14 PHP
js检验密码强度(低中高)附图
2014/06/05 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
jQuery实现自动调整字体大小的方法
2015/06/15 Javascript
JS控制FileUpload的上传文件类型实例代码
2016/10/07 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
jQuery简单实现根据日期计算星期几的方法
2019/01/09 jQuery
如何能分清npm cnpm npx nvm
2019/01/17 Javascript
vue项目打包后怎样优雅的解决跨域
2019/05/26 Javascript
Vue搭建后台系统需要注意的问题
2019/11/08 Javascript
[01:43]深扒TI7聊天轮盘语音出处4
2017/05/11 DOTA
Python中运行并行任务技巧
2015/02/26 Python
Python内存管理方式和垃圾回收算法解析
2017/11/11 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
2018/06/11 Python
使用Python实现租车计费系统的两种方法
2018/09/29 Python
Django框架自定义模型管理器与元选项用法分析
2019/07/22 Python
python3.6 tkinter实现屏保小程序
2019/07/30 Python
详解基于canvas的视频遮罩插件
2018/01/04 HTML / CSS
canvas实现手机的手势解锁的步骤详细
2020/03/16 HTML / CSS
N:Philanthropy官网:美国洛杉矶基础款服装
2020/06/09 全球购物
模具设计与制造专业应届生求职信
2013/10/18 职场文书
小学教师管理制度
2014/01/18 职场文书
党员党性分析材料
2014/02/17 职场文书
产品质量承诺书范文
2014/03/27 职场文书
2014乡镇干部对照检查材料思想汇报
2014/09/26 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书
几款流行的HTML5 UI框架比较(小结)
2021/04/08 HTML / CSS
Python中X[:,0]和X[:,1]的用法
2021/05/10 Python