首頁  >  文章  >  web前端  >  在Node.js中如何使用DNS模組(詳細教學)

在Node.js中如何使用DNS模組(詳細教學)

亚连
亚连原創
2018-06-02 17:23:401640瀏覽

本篇文章給大家詳細介紹了Node.js中DNS模組的相關知識點,以及相關的實例程式碼做了分享,有興趣的朋友參考下。

1. DNS

在Node.js中,提供DNS模組,以實現網域名稱查找及網域解析的處理。

  • 在DNS模組中,提供了三個主方法及一系列便捷方法。

  • resolve方法:用於將一個網域解析為一組DNS記錄。

  • reverse方法: 用於將IP位址轉換為一組網域名稱。

  • lookup方法: 用來將一個網域轉換成IP位址。

  • DNS模組中的其餘便捷方法均為resolve方法的一種便捷形式。

2. 使用resolve方法將網域解析為DNS記錄

`DNS.resolve(domain, [rrtype ], callback(err, address){...})`

domain參數為一個字串,用於指定需要被解析的域名,可以包括子域名。
rrtypr參數為字串,用於指定需要取得的記錄類型,可指定的記錄類型如下。

  • A,此參數值為預設值,當記錄類型為A時,該記錄將一個IPv4位址對應為一個網域名稱。

  • AAAA,當記錄類型為AAAA時,該記錄將一個IPv6位址對應為一個網域名稱。

  • CNAME,當記錄類型為CNAME時,表示該記錄為一個網域的別名記錄,例如,一個www.example.com網域記錄也許為一個example.com網域記錄額別名記錄。

  • MX,MX記錄指向一個使用SMTP的網域中的郵件伺服器,例如,當你想要person@domain.com郵件地址發送電子郵件時,domain.com網域的MX記錄中保存了發送該郵件時的郵件伺服器位址。

  • TXT,TXT記錄是為該網域附加的描述記錄。

  • SRV,SRV記錄用於為一個特定網域中所有可用服務提供資訊。

  • PTR,PTR記錄用於反向位址解析,該記錄將一個網域名稱對應為一個IPv4位址。

  • NS,NS(Name Server)記錄是網域名稱伺服器記錄,用來指定該網域由哪個DNS伺服器解析。

回呼函數有兩個參數,err是網域解析失敗時觸發的錯誤對象,addresses參數為數組,其中存放了所有取得到的DNS記錄。

3. 為resolve方法定制的各種便捷方法

  • DNS.resolve4(domain, callback),取得IPv4位址

  • DNS.resolve6(domain, callback),取得IPv6位址

  • ##DNS.resolveMx(domain, callback),取得MX記錄,郵件交換伺服器記錄

  • DNS.resolveTxt(domain, callback),取得TXT記錄,網域附加的描述記錄

  • DNS. resolveSrv(domain, callback),取得SRV記錄,服務記錄

  • DNS.resolveNs(domain, callback),取得NS記錄,網域名稱伺服器記錄

  • #DNS.resolveCname(domain, callback),取得別名記錄

#4. 使用lookup方法查詢IP位址

當使用resolve4方法或resolve6方法時,由於callback參數值回呼函數中的addresses參數值數組中存放著所有取得到的IPv4位址或IPv6位址。因此DNS模組中提供了一個取得第一個被發現的IPv4位址或IPv6位址的lookup方法


`DNS.lookup(domain, [family], callback(err, addresses, family) {...})`

  • domain參數為字串,用於指定需要解析的網域名稱

  • family參數值為一個整數值,用於指定需要取得的IP位址類型,可指定的參數值為4或6,預設參數值為null,表示既可以取得IPv4,又可以取得IPv6

  • 回呼函數err參數值為取得位址失敗時觸發的錯誤對象,當網域不存在或查詢失敗時該錯誤對象的code屬性值為ENOENT

  • addresses參數值為一個字串,為取得到的IP位址

  • family參數值為4時,表示為一個IPv4位址,為6時,表示為一個IPv6位址。

5. 使用reverse方法反向解析IP位址

#在DNS模組中,使用reverse方法將IP位址反向解析為一組與此IP位址綁定的網域名稱


`DNS.reverse(ip, callback(err, domains){...})`

  • ip參數值為一個字串,用於指定需要解析的IP位址

  • 回呼函數的err為反向解析位址失敗後的錯誤物件

  • domains參數值為一個數組,存放了所有取得到的網域名稱

6. DNS模組中的各種錯誤代碼

err參數值為執行各種解析或反向解析操作時觸發的錯誤對象,可根據該錯誤對象的code屬性值,即觸發的錯誤代號判斷出發了什麼錯誤

  • ENODATA:DNS伺服器傳回一個沒有資料的查詢結果

  • EFORMERR:DNS伺服器發現客戶端請求查詢時使用了格式錯誤的查詢參數

  • ESERVFAIL:DNS伺服器執行查詢操作失敗

  • ENOTFOUND:未發現任何網域名稱

  • ENOTIMP:DNS伺服器不能進行客戶端所要求的查詢操作

  • EREFUSED:DNS伺服器拒絕進行查詢操作

  • ##EBADQUERY:格式錯誤的DNS查詢

  • EBADNAME:網域名稱格式錯誤

  • EBADFAMILY:不支援的IP位址類型

  • EBADRESP:DNS答案的格式錯誤

  • ECONNREFUSED:不能建立與DNS伺服器之間的連線

  • ETIMEOUT:與DNS伺服器之間建立連線逾時

  • EEOF:已到達檔案底部

  • EFILE:讀取檔案失敗

  • ENOMEM:沒有足夠的記憶體空間

  • EDESTRUCTION:通道已經被銷毀

  • EBADSTR:字串格式錯誤

  • #EBADFLAGS:指定了錯誤的判斷標誌

  • ENONAME:指定的主機名稱不是數值格式的

  • EBADHINTS:指定的提示標誌無效

  • ENOTINITIALIZED:c-ares類別庫初始化工作尚未完成

  • ELOADIPHLPAPI:載入iphlpapi.dll時觸發了一個錯誤

  • EADDREGETNETWORKPARAMS:未發現GetNetworkParams函數

  • ##ECANCELLED:DNS查詢操作被取消


#7. DNS模組的基本使用

const dns = require('dns');
let url = 'www.qq.com';

dns.resolve(url, 'A', (err, addresses) => {
  console.log(addresses);
  // IPv4地址 [ '103.7.30.123' ]
});

dns.resolve(url, 'AAAA', (err, addresses) => {
  console.log(addresses);
  // IPv6地址 [ '240e:e1:8100:28::2:16' ]
});
dns.resolveMx('qq.com', (err, addresses) => {
  console.log(addresses);
  // 邮件交换服务器记录
  // [ { exchange: 'mx2.qq.com', priority: 20 },
  //  { exchange: 'mx1.qq.com', priority: 30 },
  //  { exchange: 'mx3.qq.com', priority: 10 } ]
  
});

dns.resolveTxt('qq.com', (err, addresses) => {
  console.log(addresses);
  // 域名附加的描述记录
  // [ [ 'v=spf1 include:spf.mail.qq.com -all' ] ]
});

dns.resolveSrv('www.baidu.com', (err, addresses) => {
  console.log(addresses);
  // 服务记录
  // []
});

dns.resolveNs('www.github.com', (err, addresses) => {
  console.log(addresses);
  // 域名服务器记录
  // [ 'ns-421.awsdns-52.com',
  // 'ns-520.awsdns-01.net',
  // 'ns1.p16.dynect.net',
  // 'ns2.p16.dynect.net',
  // 'ns3.p16.dynect.net',
  // 'ns4.p16.dynect.net',
  // 'ns-1283.awsdns-32.org',
  // 'ns-1707.awsdns-21.co.uk' ]
});

dns.resolveCname('www.163.com', (err, addresses) => {
  console.log(addresses);
  // 获取别名记录
  // [ 'www.163.com.lxdns.com' ]
});


dns.lookup('google.com', 4, (err, address, family) => {
  // 查询IP地址
  // address,查询到的地址
  // family,IPv4或IPv6
  console.log(address);// 172.217.27.142
  console.log(family);// 4
});

dns.lookup('google.com', 6, (err, address, family) => {
  console.log(address);// 2404:6800:4008:803::200e
  console.log(family);// 6
});

dns.reverse('203.188.200.67', (err, domain) => {
  // 反向解析IP地址
  console.log(domain);
  // [ 'media-router-fp1.prod.media.vip.tp2.yahoo.com' ]
});

上面是我整理給大家的,希望今後對大家有幫助。

相關文章:

vue-router相關基礎與工作原理

#axios post提交formdata的實例

在vue元件中使用axios的方法

以上是在Node.js中如何使用DNS模組(詳細教學)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn