作者:手机用户2602903963 | 来源:互联网 | 2022-01-05 08:50
Nodejs的DNS模块包涵有关DNS查询和操作的方法,下面介绍该模块的基本用法以及实现一个DNS查询小工具。
1.获取DNS服务器地址
使用getServers
方法,该方法返回一个IP地址组成的数组,如下所示:
1 2 3 | 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', '114.114.114.114',
'8.8.8.8' ]
2.使用系统特性域名解析获取IP地址
使用dns.lookup(hostname[, options], callback)
方法,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}对象。使用如下所示:
1 2 3 4 | dns.lookup( 'www.baidu.com' ,(err,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时,结果如下:
1 2 3 4 5 6 | dns.lookup( 'www.baidu.com' ,{family:4,all:!0,hints:dns.ADDRCONFIG|dns.V4MAPPED},(err,addresses)=>{
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和端口获取主机名
使用dns.lookupService(address, port, callback)
方法,该方法依赖getnameinfo底层函数。
callback函数有三个参数(err, hostname, service),service是protocol,为http或https,使用如下所示:
1 2 3 4 | dns.lookupService( '127.0.0.1' ,80,(err,hostname,service)=>{
if (err) console.log(err);
console.log( '该IP对应的主机为:' +hostname+ ' 协议为:' +service);
});
|
结果如下:
E:\developmentdocument\nodejsdemo>node dns-example.js
该IP对应的主机为:www.test.zmx.com 协议为:http
4.使用网络域名解析获取IP地址
使用dns.resolve(hostname[, rrtype], callback)
方法,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,使用如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | dns.resolve( 'www.qq.com' , 'A' ,(err,address)=>{
if (err) throw err;
console.log(address);
});
dns.resolve( 'www.qq.com' , 'AAAA' ,(err,address)=>{
if (err) throw err;
console.log(address);
});
dns.resolve( 'www.qq.com' , 'SOA' ,(err,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 }
});
dns.resolve( 'www.baidu.com' , 'CNAME' ,(err,address)=>{
if (err) throw err;
console.log(address);
});
|
resovle还存在很多快捷方法,例如:resolve4,resolve6,resolveCname...等等
5.反向域名解析
使用dns.reverse(ip, callback)
方法,callback有两个参数(err, hostnames),hostnames是一个域名数组,使用如下所示:
1 2 3 4 | dns.reverse( '114.114.114.114' ,(err,hostnames)=>{
if (err) throw err;
console.log(hostnames);
});
|
学完了以上的知识后,可以做个DNS查询的小工具,如下所示:
第一步,写个HTML静态页面,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <div id= "res" class= "res" ></div>
<div class= "g-wrap clearfix" >
<div class= "u-list fl" >
<a href= "Javascript:;" class= "type" id= "type" data-value= "A" >IPV4</a>
<ul id= "list" class= "list" >
<li class= "item" data-value= "A" >IPV4</li>
<li class= "item" data-value= "AAAA" >IPV6</li>
<li class= "item" data-value= "CNAME" >CNAME</li>
<li class= "item" data-value= "SOA" >SOA</li>
</ul>
</div>
<div class= "u-inp fl" >
<input type= "text" class= "host" id= "host" placeholder= "请输入域名" >
</div>
<div class= "u-btn fl" >
<span class= "btn" id= "btn" >查询</span>
</div>
</div>
|
接着编写服务端代码,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | var http = require( 'http' ),
url = require( 'url' ),
dns = require( 'dns' ),
qs = require( 'querystring' ),
fs = require( 'fs' );
function router(req,res,pathname){
switch (pathname){
case '/dnslookup' :
lookup(req,res);
break ;
default :
showIndex(req,res);
}
}
function showIndex(req,res){
var pagePath = __dirname+ '/' + 'dns-lookup.html' ;
var html = fs.readFileSync(pagePath);
res.end(html);
}
function lookup(req,res){
var postData = '' ;
req.on( 'data' , function (data){
postData+=data;
});
req.on( 'end' , function (data){
var json = qs.parse(postData);
var hostname = json.host;
var rrtype = json.rrtype;
dns.resolve(hostname,rrtype, function (err,adresses){
if (err){
res.end(JSON.stringify({errcode:1,ips:[]}));
}
res.end(JSON.stringify({errcode:0,ips:adresses}));
});
});
}
http.createServer( function (req,res){
var pathname = url.parse(req.url).pathname;
req.setEncoding( "utf8" );
res.writeHead(200,{ 'Content-Type' : 'text/html' });
router(req,res,pathname);
}).listen(3000, '127.0.0.1' );
|
运行效果如下:
到此这个小工具便完成了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。