微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

浅析Node.js:DNS模块的使用

Nodejs的DNS模块包涵有关DNS查询和操作的方法,下面介绍该模块的基本用法以及实现一个DNS查询小工具。

1.获取DNS服务器地址

使用ottom: 2px; padding-top: 2px; padding-left: 4px; padding-right: 4px; background-color: rgb(249,242,244)">getServers方法,该方法返回一个IP地址组成的数组,如下所示:

rush:js;"> const dns = require('dns'); const servers = dns.getServers(); console.log(servers);

返回结果为:

[ '114.114.114.114','8.8.8.8', 'fec0:0:0:ffff::1','114.114.114.114', '8.8.8.8', '8.8.8.8' ]

2.使用系统特性域名解析获取IP地址

使用方法,options参数包涵以下属性

  • family:地址协议族,必须为4或6的整数
  • hints:设置getaddrinfo的标志,dns.ADDRCONfig 或者 dns.V4MAPPED(ipv4映射成ipv6)
  • all:false(认),布尔值,如设置为true,则返回IP数组,否则返回单个IP地址

callback回调函数有三个参数(err,address,family),如果options的all属性设置为true,则只有(err,addresses)参数且addresses为一个数组,数组元素为{address,family}对象。使用如下所示:

{ if(err) throw err; console.log('百度网站的IP地址是:'+address+'地址协议族是:IPV'+family); });

结果如下:

E:\developmentdocument\nodejsdemo>node dns-example.js 百度网站的IP地址是:14.215.177.37地址协议族是:IPV4

设置options的all为true时,结果如下:

{ if(err) throw err; addresses.forEach((ele,idx,arr)=>{ console.log('百度网站的IP地址'+(idx+1)+'是:'+ele.address); }); });

结果如下:

E:\developmentdocument\nodejsdemo>node dns-example.js 百度网站的IP地址1是:14.215.177.38 百度网站的IP地址2是:14.215.177.37

3.根据IP和端口获取主机名

使用方法,该方法依赖getnameinfo底层函数。 callback函数有三个参数(err,hostname,service),service是protocol,为http或https,使用如下所示:

{ if(err) console.log(err); console.log('该IP对应的主机为:'+hostname+' 协议为:'+service); });

结果如下:

E:\developmentdocument\nodejsdemo>node dns-example.js 该IP对应的主机为: 协议为:http

4.使用网络域名解析获取IP地址

使用方法,rrtype有以下选择:

  • 'A':IPV4,default
  • 'AAAA':IPV6
  • 'MX' - mail exchange records 邮件交换记录
  • 'TXT' - text records 域名配置说明
  • 'SRV' - SRV records 服务器提供的服务
  • 'PTR' - PTR records
  • 'NS' - name server records 域名服务器
  • 'CNAME' - canonical name records 别名记录
  • 'SOA' - start of authority record 起始授权机构
  • 'NAPTR' - name authority pointer record

callback函数有(err,addresses)两个参数,addresses是一个数组,具体成员需要看具体的rrtype,使用如下所示:

{ if(err) throw err; console.log(address);//结果为[ '14.17.32.211','14.17.42.40','59.37.96.63' ] }); //获取IPV6 dns.resolve('www.qq.com','AAAA',address)=>{ if(err) throw err; console.log(address);//结果为[ '240e:ff:f040:28::a' ] }); //获取SOA信息 dns.resolve('www.qq.com','SOA',address)=>{ if(err) throw err; console.log(address); //结果为 { nsname: 'ns-tel1.qq.com',hostmaster: 'webmaster.qq.com',serial: 1380440321,refresh: 300,retry: 600,expire: 86400,minttl: 300 } }); //获取别名CNAME dns.resolve('www.baidu.com','CNAME',address)=>{ if(err) throw err; console.log(address);//结果为[ 'www.a.shifen.com' ] });

resovle还存在很多快捷方法,例如:resolve4,resolve6,resolveCname...等等

5.反向域名解析

使用方法,callback有两个参数(err,hostnames),hostnames是一个域名数组,使用如下所示:

{ if(err) throw err; console.log(hostnames);//结果为[ 'public1.114dns.com' ] });

学完了以上的知识后,可以做个DNS查询的小工具,如下所示:

第一步,写个HTML静态页面,如下:

DNS查询工具