文档章节

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

码农般的学良
 码农般的学良
发布于 2016/11/25 09:28
字数 1493
阅读 32
收藏 0
点赞 0
评论 0

本篇文章主要介绍了Node.js:DNS模块的使用,DNS模块包涵有关DNS查询和操作的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

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

//获取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是一个域名数组,使用如下所示:

?

1

2

3

4

dns.reverse('114.114.114.114',(err,hostnames)=>{

  if(err) throw err;

  console.log(hostnames);//结果为[ 'public1.114dns.com' ]

});

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

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

<!DOCTYPE html>

<html lang="en">

<head>

  <meta charset="UTF-8">

  <title>DNS查询工具</title>

  <style type="text/css">

    html,body{ width: 100%; height: 100%; }

    body{ display: flex; align-items: center; justify-content: center; flex-direction: column; }

    *{ margin:0; padding: 0; }

    ul{ list-style: none; }

    .res{line-height: 24px; color:#333; }

    .clearfix:after{ display: block; content:''; height: 0; visibility: hidden; clear: both;}

    .fl{ float:left; }

    .g-wrap{ display: flex; width:560px; height: 40px; }

    .u-list{position: relative; flex:1; }

    .u-inp{flex:3; border:1px solid #ccc; border-left: none; border-right:none; padding:11px 0 11px 10px;}

    .u-btn{ flex:1; }

    .list{ display: none; position: absolute; left: 0px; top:40px; width: 100%; border:1px solid #ccc; border-top:none; border-bottom:none; box-sizing: content-box; }

    .item{ height: 30px; line-height: 30px; text-align: center; color: #666; border-bottom: 1px solid #ccc; cursor:pointer;}

    .item:hover{ color:#0087dc; }

    .u-list .type{ display: block; width: 100%; line-height: 38px; border:1px solid #ccc; text-align: center; color:#666; text-decoration: none; }

    .u-list .type:after{ content: ''; position: absolute; width:0; height:0; border:8px solid transparent; border-top-color:#ccc; right:4px; top:16px;}

    .u-inp input{ width: 100%; border:none; outline: none; height: 18px; line-height: 18px; color:#666; vertical-align: top; font-size: 14px; }

    .u-btn .btn{ display: block; line-height: 40px; text-align: center; background-color: #0087dc; color:#fff; font-size: 16px; cursor:pointer; transition: background-color .3s;}

    .u-btn .btn:hover{ background-color: #0060b2; }

  </style>

</head>

<body>

  <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>

  <script>

    function hide(el){

      el.style.display = 'none';

    }

    function show(el){

      el.style.display = 'block';

    }

    function dealResult(responseText){

      var ips = [],

        result = '';

      ips = JSON.parse(responseText).ips;

      if(Array.isArray(ips)){

        result = ips.length > 0 ? ips.join('<br />') : '没有查询到结果';

      }else if({}.toString.call(ips) === '[object Object]'){

        result = JSON.stringify(ips);

      }

      res.innerHTML = result;

    }

    type.addEventListener('click',function(e){

      e.stopPropagation();

      show(list);

    },!1);

    [].slice.call(document.body.querySelectorAll('.item')).forEach(function(el,idx,arr){

      el.addEventListener('click',function(e){

        type.innerText = this.innerText;

        type.dataset.value = this.dataset.value;

      },!1);

    });

    document.body.addEventListener('click',function(e){

      if(list.style.display === 'block'){ hide(list); }

    },!1);

    btn.addEventListener('click',function(e){

      var hostname = host.value.trim(),

        rrtype  = type.dataset.value.toUpperCase();

      if(hostname == '') return;

      if(hostname.indexOf('http://') === 0) hostname = hostname.replace('http://','');

      var xhr = new XMLHttpRequest(),

        method = "POST",

        url = "/dnslookup";

 

      xhr.open(method, url, true);

      xhr.onreadystatechange = function() {

        if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {

          dealResult(xhr.responseText);

        }

      };

      xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

      xhr.send('host='+hostname+'&rrtype='+rrtype);

    },!1);

  </script>

</body>

</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');

运行效果如下:​​​​​​​

© 著作权归作者所有

共有 人打赏支持
码农般的学良
粉丝 1
博文 20
码字总数 23265
作品 0
通州
Node v10.6.0 发布,提供处于实验阶段的 DNS 模块功能

Node v10.4.0 已发布,该版本值得关注的更新是已提供处于实验阶段的 DNS 模块功能,此外还包括一些改进,如对 worker 的支持。 dns: An experimental promisified version of the dns module...

局长
07/05
0
0
Node.js 线程你理解的可能是错的

Node.js是单线程的,那么Node.js启动后线程数是1? 答案:Node.js启动后线程数并不是1,以下面代码为例 通过Mac实用工具 > 活动监视器可以查看进程的线程数其实是6 Node.js启动的线程数不为1...

Randal
06/11
0
0
Nodejs实现一个http反向代理

使用Nodejs很容易实现一个反向代理。基本思路是使用node-static查看文件是否存在本地,存在则直接返回,如果不存在则将请求转发到相应的后端服务器,dns模块对本地hosts文件内配置的域名解析...

小水熊
2014/07/04
0
0
Skywalking Node.js 探针 0.1.0 版本正式发布

项目介绍: Skywalking Node.js探针0.1.0版本正式发布了. Skywalking Node.js探针是由Skywalking社区提供专门针对Node.js生态下的后端应用提供的自动探针。 Skywalking Node.js探针遵守Skywa...

Xin_Zhang_BJ
05/21
0
1
针对 Node.js 后端应用的自动探针 - Skywalking Node.js

Skywalking Node.js探针是由Skywalking社区提供专门针对Node.js生态下的后端应用提供的自动探针 Skywalking Node.js探针遵守Skywalking追踪协议,Node.js探针能够结合SkyWalking的后端分析追...

Xin_Zhang_BJ
05/21
0
0
深入浅出Node.js(一):什么是Node.js

专栏的第一篇文章《什么是Node.js》尝试从各个角度来阐述Node.js的基本概念、发展历史、优势等,对该领域不熟悉的开发人员可以通过本文了解Node.js的一些基础知识。 从名字说起 有关Node.js...

leeldy
2012/10/25
0
1
Node.js历险记之剑未配好,已出江湖

打开微信扫一扫,关注微信公众号【数据与算法联盟】 转载请注明出处: http://blog.csdn.net/gamergyt/ 博主微博: http://weibo.com/234654758 Github: https://github.com/thinkgamer ht...

thinkgamer.cn
2017/03/05
0
0
如何使用 npm 管理 NodeJS 包

前一段时间,我们发布了一个使用 pip 管理 Python 包的指南。今天,我们将讨论如何使用 npm 管理 NodeJS 包。npm 是最大的软件注册中心,包含 600,000 多个包。每天,世界各地的开发人员通过...

作者: Sk
05/07
0
0
homebridge安装问题解决

报错 dns_sd.DNSServiceRegister(self.serviceRef, flags, ifaceIdx, name, ^ Error: dns service error: unknown at Error (native) at new Advertisement (/usr/local/lib/nodemodules/hom......

stevenliu
05/11
0
0
Centos6安装安装node.js

install node v7.x #设置镜像 #安装nodejs #验证安装情况 install node v8.x curl --silent --location https://rpm.nodesource.com/setup8.x | bash - sudo yum install -y nodejs #验证安装......

qianghong000
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NNS域名系统之域名竞拍

0x00 前言 其实在官方文档中已经对域名竞拍的过程有详细的描述,感兴趣的可以移步http://doc.neons.name/zh_CN/latest/nns_protocol.html#id30 此处查阅。 我这里主要对轻钱包开发中会用到的...

暖冰
今天
0
0
32.filter表案例 nat表应用 (iptables)

10.15 iptables filter表案例 10.16/10.17/10.18 iptables nat表应用 10.15 iptables filter表案例: ~1. 写一个具体的iptables小案例,需求是把80端口、22端口、21 端口放行。但是,22端口我...

王鑫linux
今天
0
0
shell中的函数&shell中的数组&告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

影夜Linux
今天
0
0
Linux网络基础、Linux防火墙

Linux网络基础 ip addr 命令 :查看网口信息 ifconfig命令:查看网口信息,要比ip addr更明了一些 centos 7默认没安装ifconfig命令,可以使用yum install -y net-tools命令来安装。 ifconfig...

李超小牛子
今天
1
0
[机器学习]回归--Decision Tree Regression

CART决策树又称分类回归树,当数据集的因变量为连续性数值时,该树算法就是一个回归树,可以用叶节点观察的均值作为预测值;当数据集的因变量为离散型数值时,该树算法就是一个分类树,可以很...

wangxuwei
昨天
1
0
Redis做分布式无锁CAS的问题

因为Redis本身是单线程的,具备原子性,所以可以用来做分布式无锁的操作,但会有一点小问题。 public interface OrderService { public String getOrderNo();} public class OrderRe...

算法之名
昨天
10
0
143. Reorder List - LeetCode

Question 143. Reorder List Solution 题目大意:给一个链表,将这个列表分成前后两部分,后半部分反转,再将这两分链表的节点交替连接成一个新的链表 思路 :先将链表分成前后两部分,将后部...

yysue
昨天
1
0
数据结构与算法1

第一个代码,描述一个被称为BankAccount的类,该类模拟了银行中的账户操作。程序建立了一个开户金额,显示金额,存款,取款并显示余额。 主要的知识点联系为类的含义,构造函数,公有和私有。...

沉迷于编程的小菜菜
昨天
1
0
从为什么别的队伍总比你的快说起

在机场候检排队的时候,大多数情况下,别的队伍都要比自己所在的队伍快,并常常懊悔当初怎么没去那个队。 其实,最快的队伍只能有一个,而排队之前并不知道那个队快。所以,如果有六个队伍你...

我是菜鸟我骄傲
昨天
1
0
分布式事务常见的解决方案

随着互联网的发展,越来越多的多服务相互之间的调用,这时候就产生了一个问题,在单项目情况下很容易实现的事务控制(通过数据库的acid控制),变得不那么容易。 这时候就产生了多种方案: ...

小海bug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部