Nodejs的DNS模块包涵有关DNS查询和操作的方法,下面介绍该模块的基本用法以及实现一个DNS查询小工具。
1.获取DNS服务器地址
使用getServers
方法,该方法返回一个IP地址组成的数组,如下所示:
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参数包涵以下属性:
callback回调函数有三个参数(err,address,family),如果options的all属性设置为true,则只有(err,addresses)参数且addresses为一个数组,数组元素为{address,family}对象。使用如下所示:
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时,结果如下:
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,使用如下所示:
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有以下选择:
callback函数有(err, addresses)两个参数,addresses是一个数组,具体成员需要看具体的rrtype,使用如下所示:
//获取IPV4 dns.resolve('www.qq.com','A',(err,address)=>{ 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',(err,address)=>{ if(err) throw err; console.log(address);//结果为[ '240e:ff:f040:28::a' ] }); //获取SOA信息 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 } }); //获取别名CNAME dns.resolve('www.baidu.com','CNAME',(err,address)=>{ if(err) throw err; console.log(address);//结果为[ 'www.a.shifen.com' ] });
resovle还存在很多快捷方法,例如:resolve4,resolve6,resolveCname...等等
5.反向域名解析
使用dns.reverse(ip, callback)
方法,callback有两个参数(err, hostnames),hostnames是一个域名数组,使用如下所示:
dns.reverse('114.114.114.114',(err,hostnames)=>{ if(err) throw err; console.log(hostnames);//结果为[ 'public1.114dns.com' ] });
学完了以上的知识后,可以做个DNS查询的小工具,如下所示:
第一步,写个HTML静态页面,如下:
接着编写服务端代码,如下:
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');
运行效果如下:
到此这个小工具便完成了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。