当前位置: 首页 > news >正文

Node.js——dns模块

dns模块

    • 1、resolve方法将域名解析为DNS记录
    • 2、lookup方法查询IP地址
    • 3、reverse方法反向解析IP地址
    • 4、dns模块中的各种错误代码

在网络编程中,开发者更倾向于使用域名,而不是IP地址来指定网络连接的目标地址。在Node.js中,提供dns模块,以实现域名查找及域名解析的处理。

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

1、resolve方法将域名解析为DNS记录

resolve方法用于将一个域名解析为一组DNS记录,该方法的使用方式如下所示。

dns.resolve(domain,[rrtype],callback)
  • domain:一个字符串,用于指定需要被解析的域名,例如www.google.com,该域名字符串中可包括子域名
  • rrtype:可选,一个字符串,用于指定需要获取的记录类型,可指定的记录类型如下所示。
    • “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服务器进行解析。
  • callback:callback参数值用于指定当域名解析操作完成时调用的回调函数,该回调函数的指定方法如下所示。
function(err,addresses){//回调函数代码略}
  • err:解析失败时触发的错误对象
  • addresses:一个数组,其中存放了所有获取到的DNS记录

示例:使用resolve方法解析“www.baidu.com”域名并获取所有记录类型为“A”的DNS记录(当记录类型为“A”时,DNS记录为“www.baidu.com”域名的所有IPv4地址)​,如果解析失败,在控制台中输出解析失败时触发的错误对象,如果解析成功,在控制台中输出所有获取到的IPv4地址。

constdns=require('dns');dns.resolve('www.baidu.com','A',(e,r)=>{if(e){console.log(e);}else{console.log(r);}});
['220.181.111.1','220.181.111.232']

在dns模块中,为resolve方法定制了各种便捷方法,所有这些方法都使用一个domain参数与一个callback参数,这两个参数的用途及指定方法与resolve方法中所使用的domain参数与callback参数的用途及指定方法完全相同。这些方法见表:

方法说明
dns.resolve4(domain, callback)用于获取记录类型为“A”的DNS记录,即IPv4地址,callback参数值回调函数中的address参数值数组中存放所有获取到的Pv4地址,例如[‘74.125.79.104’,74.125.79.105,'74.125.79.106]
dns.resolve6(domain, callback)用于获取记录类型为“AAAA”的DNS记录,即IPv6地址,callback参数值回调函数中的address参数值数组中存放所有获取到的IPv6地址,例如[2404:6800:4005:803:1010]
dns.resolveMx(domain, callback)用于获取MX记录,即邮件交换服务器记录,callback参数值回调函数中的address参数值数组中存放所有获取到的MX记录,每条记录中都包含个priority(优先级)属性及一个exchange(邮件交换服务器)属性,例如[{'priority:10,‘exchange’:'mx.example.com)]
dns.resolveTxt(domain, callback)用于获取TXT记录,即为该域名附加的描述记录,callback参数值回调函数中的address参数值数组中存放所有获取到的TXT记录,例如['v=spfl ip4:0.0.0.0~all"]
dns.resolveSrv(domain, callback)用于获取SRV记录,即服务记录,callback参数值回调函数中的address参数值数组中存放所有获取到的SRV记录,每条记录中都包含一个priority(优先级)属性、一个weight(权重)属性、一个port(端口号)属性及一个name(域名)属性,例如[{priority’:l0,{‘weight’:5,‘port’:2l223,'name:‘service.example.com’)]
dns.resolveNs(domain, callback)用于获取NS记录,即域名服务器记录,callback参数值回调函数中的address参数值数组中存放所有获取到的域名服务器,例如[‘nsl.example.com’,‘ns2.example.com’]
dns.resolveCname(domain, callback)用于获取别名记录,callback参数值回调函数中的address参数值数组中存放所有获取到的别名记录,例如[bar.example.com]

示例:使用resolveMx方法解析“google.com”域名并获取所有邮件交换服务器记录,如果解析失败,在控制台中输出解析失败时触发的错误对象,如果解析成功,在控制台中输出所有获取到的邮件交换服务器记录。

constdns=require('dns');dns.resolveMx('google.com',(err,addresses)=>{if(err){console.log(err);}console.log(addresses);});
[{exchange:'smtp.google.com',priority:10}]

2、lookup方法查询IP地址

当使用resolve4方法或resolve6方法时,由于callback参数值回调函数中的address参数值数组中存放所有获取到的IPv4地址或IPv6地址,因此,dns模块中也提供了另一个用于获取第一个被发现的IPv4地址或IPv6地址的lookup方法,该方法的使用方式如下所示。

dns.lookup(domain,[family],callback)
  • domain:一个字符串,用于指定需要解析的域名,例如www.google.com,该域名字符串中可包括子域名
  • family:可选,一个整数值,用于指定需要获取的IP地址类型,可指定的参数值为4或6。当参数值为4时获取IPv4地址,当参数值为6时获取IPv6地址。默认参数值为null,表示既可获取IPv4地址,又可获取IPv6地址。
  • callback:callback参数值用于指定当获取地址操作完成时调用的回调函数,该回调函数的指定方法如下所示。
function(err,address,family){//回调函数代码略}
  • err:获取地址失败时触发的错误对象,当域名不存在或查询失败时该错误对象的code属性值为ENOENT
  • address:一个字符串,字符串值为获取到的IP地址
  • family:一个整数,用于标识获取到的IP地址类型。当family参数值为4时,表示该地址为一个IPv4地址,当family参数值为6时,表示该地址为一个IPv6地址。

示例:使用lookup方法获取“google.com”域名的IPv4地址,如果获取地址失败,那么在控制台中输出获取地址失败时触发的错误对象,如果获取地址成功,那么在控制台中输出获取到的IPv4地址。

constdns=require('dns');dns.lookup('google.com',4,(err,address)=>{if(err){console.log(err);}else{console.log(address);}});
142.251.45.142

3、reverse方法反向解析IP地址

在dns模块中,可以使用reverse方法将一个IP地址反向解析为一组与该IP地址绑定的域名。该方法的使用方式如下所示。

dns.reverse(ip,callback)
  • ip:一个字符串,用于指定需要被反向解析的IP地址
  • callback:指定当反向解析地址操作完成时调用的回调函数,该回调函数的指定方法如下所示。
function(err,domains){//回调函数代码略}
  • err:反向解析地址失败时触发的错误对象
  • domains:一个数组,其中存放了所有获取到的域名

示例:使用reverse方法反向解析“202.165.102.205”地址,如果反向解析失败,在控制台中输出反向解析失败时触发的错误对象,如果反向解析成功,在控制台中输出所有获取到的域名。

constdns=require('dns');dns.reverse('202.165.102.205',(err,domain)=>{if(err){console.log(err);}else{console.log(domain);}});
['unknown.yahoo.com']

4、dns模块中的各种错误代码

在dns模块中,在各种方法的callback参数值回调函数中,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:指定的主机名不是数值格式的。
  • ENOTINITIALIZED:c-ares类库初始化工作尚未完成。
  • ELOADIPHLPAPI:加载iphlpapi.dll时触发了一个错误。
  • EADDRGETNETWORKPARAMS:未发现GetNetworkParams函数。
  • ECANCELLED:DNS查询操作被取消。
http://www.jsqmd.com/news/593299/

相关文章:

  • 第26课:Qt 接管 MISC、input 与定时器,把事件流和倒计时界面一起跑通
  • NSudo完全指南:轻松获取Windows最高权限的5种方法
  • 告别B站资源无法保存的烦恼:BiliTools跨平台工具箱完整使用指南
  • nacos
  • 第27课:Qt 看门狗倒计时实战,学会让界面节奏和系统守护对齐
  • 从安装到首次提交,在快马平台实战演练中掌握git核心工作流
  • 体验AI结对编程:让快马成为你的智能代码审查与优化助手
  • 输入可视化革命:如何用input-overlay消除直播中的操作信息差
  • 【GitHub项目推荐--OpenSpace:从地球到深空,打开宇宙的“数字窗口”】⭐
  • 终极图像查看器Nomacs:专业级功能完全指南
  • 数据库集群中的bond1接口出现网络丢包
  • 实战指南:用快马生成altium designer数据采集板卡全流程设计项目
  • RePKG:5个高效技巧助你掌握Wallpaper Engine资源处理与格式转换
  • 第28课:Qt 读系统时钟并响应中断,让时间界面和板级事件同时在线
  • 免费游戏串流平台Sunshine:5步搭建你的专属云端游戏服务器
  • C语言高效移除数组元素的三大实战策略
  • 美团LongCat-2601:5600亿参数MoE模型解锁AI超强推理能力
  • 环模式饲料制粒机设计【农业机械】【论文+14张CAD图纸+proe三维+答辩稿】
  • 5大核心功能深度解析:AltDrag如何重新定义Windows窗口管理效率
  • 获取注解信息
  • 解锁Koikatu全部潜能的6个专业步骤:KK-HF Patch增强指南
  • ai赋能:让快马智能生成优化与测试完备的c语言排序算法库
  • 第29课:先把屏幕做得愿意被触摸,用 Qt 图形演示点亮应用感
  • MySQL 很实用的 SQL 语句清单(排障与日常运维)
  • 基于Matlab Simulink平台的柔性直流输电系统研究与优化:四端网络模型与四端换流器控...
  • 京东抢购自动化:用Python脚本实现毫秒级响应的高效抢购方案
  • 5分钟免费指南:如何将旧手机变成Linux高清摄像头
  • MySQL 常用业务 SQL
  • 用Python模拟随机游走:从一维到三维,直观理解马尔可夫链的常返性
  • 构建现代化电商平台:SpringBoot后端与Vue前端的全栈实践指南