返回顶部
首页 > 资讯 > 前端开发 > node.js >浅析Node.js:DNS模块的使用
  • 632
分享到

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

模块Nodejs 2022-06-04 17:06:56 632人浏览 泡泡鱼
摘要

nodejs的DNS模块包涵有关DNS查询和操作的方法,下面介绍该模块的基本用法以及实现一个DNS查询小工具。 1.获取DNS服务器地址 使用getServers方法,该方法返回一个IP地址组成的数组,如

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参数包涵以下属性:

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}对象。使用如下所示:


dns.lookup('www.baidu.com',(err,address,family)=>{
  if(err) throw err;
  console.log('百度网站的IP地址是:'+address+'地址协议族是:IPV'+family);
});

结果如下:

E:developmentdocumentnodejsdemo>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:developmentdocumentnodejsdemo>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,为Httphttps,使用如下所示:


dns.lookupService('127.0.0.1',80,(err,hostname,service)=>{
  if(err) console.log(err);
  console.log('该IP对应的主机为:'+hostname+' 协议为:'+service);
});

结果如下:

E:developmentdocumentnodejsdemo>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,使用如下所示:


//获取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静态页面,如下:


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

运行效果如下:查看图片

到此这个小工具便完成了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: 浅析Node.js:DNS模块的使用

本文链接: https://lsjlt.com/news/12916.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 浅析Node.js:DNS模块的使用
    Nodejs的DNS模块包涵有关DNS查询和操作的方法,下面介绍该模块的基本用法以及实现一个DNS查询小工具。 1.获取DNS服务器地址 使用getServers方法,该方法返回一个IP地址组成的数组,如...
    99+
    2022-06-04
    模块 Node js
  • 浅析Node的events模块
    在 vue 的项目中,有时我们会用到全局事件总线来管理组件之间的通信。vue2 项目里我们可以自己借助 $emit、 $on 和 $off 封装一个 eventHub;vue3 中 $on 和 $off 被移除了,我们可以使用 mitt 库...
    99+
    2023-05-14
    nodejs node
  • 浅析node中如何优雅使用Socket.IO模块
    注意: 第二个参数可以传对象,因为在emit方法内部带有JSON.stringfy()方法,自动将对象转化为字符串。onsocket.on(eventName, callback):监听一个 emit 发射的事件socket.on('...
    99+
    2022-11-22
    Socket.IO nodejs​ node
  • 深入浅析Nodejs的Http模块
    一、http服务器 我们知道传统的HTTP服务器是由Aphche、Nginx、IIS之类的软件来搭建的,但是Nodejs并不需要,Nodejs提供了http模块,自身就可以用来构建服务器,例如: ...
    99+
    2022-06-04
    模块 Nodejs Http
  • 浅析node的path路径模块
    1.path路径模块初认识path 模块是 Node.js 官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理需求。2.path模块的API2.1 path.join()path.join() 方法,用来将...
    99+
    2023-05-14
    node path模块
  • 浅析使用 Auditbeat 模块监控 shell 命令的问题
    目录禁用Auditd配置AuditbeatAuditbeat模块规则Auditbeat设置命令开始使用监控数据TTY审计测试Kibana发现思考使用 Auditbeat 模块监控 shell 命令Auditbeat Au...
    99+
    2022-06-05
    Auditbeat 模块shell 命令 Auditbeat 监控shell 命令
  • 浅析Node.js的Stream模块中的Readable对象
    我一直都很不愿意扯 nodejs 的流,因为从第一次看到它我就觉得它的设计实在是太恶心了。但是没办法,Stream 规范尚未普及,而且确实有很多东西都依赖了 nodejs 的流来实现的,所以我也只能捏着鼻子...
    99+
    2022-06-04
    模块 对象 js
  • python xlwt模块的使用解析
    目录一、基础类介绍1、工作簿类Workbook简介:2、工作表类WorkSheet简介3、创建一个不带样式的基础Excel表二、xlwt高级应用1、字体类Font简介1.1创建一个改...
    99+
    2024-04-02
  • python模块导入方式浅析步骤
    目录1.模块的使用2.导入模块并使用3.模块的导入方式之from-import 语句4.__all__变量用来控制*5.总结首先啊,在python中我们熟知的py文件就是一个模块,也...
    99+
    2024-04-02
  • 浅析JavaScript中严格模式的使用
    目录认识严格模式严格模式限制认识严格模式 在ECMAScript5标准中,JavaScript提出了严格模式的概念(Strict Mode): 严格模式很好理解,是一种具有限制性的J...
    99+
    2023-05-18
    JavaScript严格模式使用 JavaScript严格模式
  • 浅析Nodejs中的http模块和导出共享
    一、http 模块http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。【相关教程推荐:nodejs视频教程】通过 http 模块提供的 http.createServer() 方法,就能方便的把一台普通的电脑,变成...
    99+
    2022-11-22
    nodejs node
  • 浅析Python中else语句块的使用技巧
    学过C/C++的都知道,else语句是和if语句搭配使用的,但是在Python中,else语句更像是作为一个模块,不仅仅可以和if语句搭配,还可以和循环语句,异常处理语句搭配使用。 下面逐个进行介绍: &l...
    99+
    2022-06-04
    使用技巧 语句 Python
  • 浅谈Python安装并使用redis模块的方法
    这篇文章给大家分享的是有关浅谈Python安装并使用redis模块的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。安装和使用安装安装redis模块pip3 inst...
    99+
    2024-04-02
  • Node.js之网络通讯模块实现浅析
    前言 想必我们在用Node.js用的最多的应该是创建http服务,所以对于每个Web开发工程师而言,Node.js的网络相关模块学习是必不可少。 Node.js的网络模块架构 在Node.js的模块里面...
    99+
    2022-06-04
    网络通讯 模块 Node
  • 浅析node怎样链接多个JS模块
    有时候是不是会有这样的疑问:纷繁的功能文件,到最后是怎么组合成起来并且在浏览器中展示的?为什么需要 node 环境?下面本篇文章给大家介绍一下node是怎样把多个JS模块链接在一起的?希望对大家有所帮助!一、个人理解浏览器本身只能做一些展示...
    99+
    2023-05-14
    前端 Node.js JavaScript
  • JavaScript模块化:模块化的奥秘,深入浅出
    JavaScript模块化是一种组织和封装代码的方法,它允许开发人员将应用程序拆分为独立的、可复用的单元,从而提高代码的可维护性和可重用性。 模块化的优点 代码可重用性:模块允许开发人员将代码复用到多个应用程序中,从而避免重复工作。 代...
    99+
    2024-04-02
  • 浅析DedeCMS投票模块漏洞的解决方法
    打开/include/dedevote.class.php文件,查 找$this->dsql->ExecuteNoneQuery("UPDATE `dede_vote` SET totalcount...
    99+
    2022-06-12
    DedeCMS 投票模块 漏洞
  • 模块的使用
    Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用   Python模块的标准文件模板   第一行到import语句之前是标准的模板,当然也可以全部删掉不写,但是,按标准办事肯定没错   import开始...
    99+
    2023-01-31
    模块
  • python的numpy模块使用实例分析
    今天小编给大家分享一下python的numpy模块使用实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Numpy是Nu...
    99+
    2023-06-30
  • 使用Python模块:struct模块
    Python没有提供直接的将用户定义的数据类型和文件IO关联起来的功能,但是它提供了struct库(是一个内置库)——我们可以以二进制模式来写这些数据(有趣的是,它真的是设计来讲文本数据写为缓存的) 1)bytes、str...
    99+
    2023-01-31
    模块 Python struct
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作