资讯专栏INFORMATION COLUMN

Node.js学习之路17——DNS模块介绍

roadtogeek / 3218人阅读

摘要:在中,提供模块,以实现域名查找及域名解析的处理。方法用于将一个域名解析为一组记录。记录是域名服务器记录,用来指定该域名由哪个服务器进行解析。回调函数有两个参数,是域名解析失败时触发的错误对象,参数为一个数组,其中存放了所有获取到的记录。

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地址类型,可指定的参数值为46,默认参数值为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" ]
});

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92996.html

相关文章

  • Node.js学习之路19——punycode模块与os模块

    摘要:模块转换为编码模块内部使用类库以将域名从地方语言所采用的各种编码转换为可用于服务器的编码因为操作系统的核心都是英文服务器的解析也是由英文代码交换所以服务器并不支持直接的使用地方语言的域名解析所有地方语言域名的解析都需要转成编码然后由服务器解 1. punycode punycode模块转换为punycode编码 punycode模块内部使用punycode.js类库,以将域名从地方...

    xumenger 评论0 收藏0
  • node学习之路(一)—— 网络请求

    摘要:域套接字使用或指定请求方法的字符串。请求路径包含非法字符时抛出异常。保持资源池周围的套接字在未来被用于其它请求。默认值为当使用的时候,通过正在保持活动的套接字发送包的频繁程度。 文章来源:小青年原创发布时间:2016-09-29关键词:JavaScript,nodejs,http,url ,Query String,爬虫转载需标注本文原始地址: http://zhaomenghuan....

    bovenson 评论0 收藏0
  • 前端每周清单第 41 期 : Node 与 Rust、OpenCV 的火花,网络安全二三事

    摘要:的网站仍然使用有漏洞库上周发布了开源社区安全现状报告,发现随着开源社区的日渐活跃,开源代码中包含的安全漏洞以及影响的范围也在不断扩大。与应用安全是流行的服务端框架,本文即是介绍如何使用以及其他的框架来增强应用的安全性。 showImg(https://segmentfault.com/img/remote/1460000012181337?w=1240&h=826); 前端每周清单专注...

    syoya 评论0 收藏0
  • 「真®全栈之路」Web前端开发的后端指南

    前言 在若干次前的一场面试,面试官看我做过python爬虫/后端 的工作,顺带问了我些后端相关的问题:你觉得什么是后端? 送命题。当时脑瓦特了,答曰:逻辑处理和数据增删改查。。。 showImg(https://user-gold-cdn.xitu.io/2019/4/24/16a4ed4fc8c18078); 当场被怼得体无完肤,羞愧难当。事后再反思这问题,结合资料总结了一下。发现自己学过的Re...

    chuyao 评论0 收藏0
  • 2017-10-17 前端日报

    摘要:前端日报精选现代浏览器性能优化篇谈谈算法第一章学习笔记实现里为什么会有,我们做了一款极客时间中文第期浮点数陷阱及解法译调度器入门掘金译定位掘金布局说可能是最全的特性及其在实际应用中的表现掘金简单的继承众成翻译中的正则表达 2017-10-17 前端日报 精选 现代浏览器性能优化-JS篇谈谈 HTTPS《算法》第一章学习笔记js实现JS 里为什么会有 thisHi,我们做了一款 极客时间...

    CloudwiseAPM 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<