鍍金池/ 教程/ HTML/ DNS
模塊
斷言測(cè)試
Buffer
Smalloc
TTY
概述
REPL
HTTP
DNS
路徑
集群
TLS/SSL
系統(tǒng)
加密
調(diào)試器
進(jìn)程
Punycode
虛擬機(jī)
HTTPS
網(wǎng)絡(luò)
Query String
C/C++ 插件
實(shí)用工具
文件系統(tǒng)
Zlib
子進(jìn)程
UDP/Datagram Sockets
定時(shí)器
逐行讀取
字符串解碼器
全局對(duì)象
事件
URL
控制臺(tái)

DNS

穩(wěn)定性: 3 - 穩(wěn)定

調(diào)用 require('dns') 可以訪問這個(gè)模塊。

這個(gè)模塊包含的函數(shù)屬于2個(gè)不同的分類:

1)使用系統(tǒng)底層的特性,完成名字解析,這個(gè)過程不需要網(wǎng)絡(luò)通訊,這個(gè)分類僅有一個(gè)函數(shù): dns.lookup開發(fā)者在同一個(gè)系統(tǒng)里名字解析都是用 dns.lookup.

下面的例子,解析 www.google.com.

var dns = require('dns');

dns.lookup('www.google.com', function onLookup(err, addresses, family) {
  console.log('addresses:', addresses);
});

2)連接到 DNS 服務(wù)器進(jìn)行名字解析,始終使用網(wǎng)絡(luò)來進(jìn)行域名查詢。這個(gè)分類包含除了 dns.lookup 外的所有函數(shù)。這些函數(shù)不會(huì)和 dns.lookup 使用同一套配置文件。如果你不想使用系統(tǒng)底層的特性來進(jìn)行名字解析,而想進(jìn)行 DNS 查詢的話,可以用這個(gè)分類的函數(shù)。

下面的例子,解析了'www.google.com',并反向解析返回的 IP 地址。

var dns = require('dns');

dns.resolve4('www.google.com', function (err, addresses) {
  if (err) throw err;

  console.log('addresses: ' + JSON.stringify(addresses));

  addresses.forEach(function (a) {
    dns.reverse(a, function (err, hostnames) {
      if (err) {
        throw err;
      }

      console.log('reverse for ' + a + ': ' + JSON.stringify(hostnames));
    });
  });
});

更多細(xì)節(jié)參考Implementation considerations section

dns.lookup(hostname[, options], callback)

將域名(比如 'google.com')解析為第一條找到的記錄 A (IPV4)或 AAAA(IPV6)。參數(shù) options可以是一個(gè)對(duì)象或整數(shù)。如果沒有提供 options,IP v4 和 v6 地址都可以。如果 options 是整數(shù),則必須是 46。

options 參數(shù)可能是包含 familyhints 兩個(gè)屬性的對(duì)象。這兩個(gè)屬性都是可選的。如果提供了 family,則必須是 46,否則,IP v4 和 v6 地址都可以。如果提供了 hints,可以是一個(gè)或者多個(gè) getaddrinfo 標(biāo)志,若不提供,沒有標(biāo)志會(huì)傳給 getaddrinfo。多個(gè)標(biāo)志位可以通過或運(yùn)算來整合。以下的例子展示如何使用 options。

{
  family: 4,
  hints: dns.ADDRCONFIG | dns.V4MAPPED
}

參見 supported getaddrinfo flags 查看更多的標(biāo)志位。

回調(diào)函數(shù)包含參數(shù) (err, address, family)。 address參數(shù)表示 IP v4 或 v6 地址。family 參數(shù)是4 或 6,表示 address 家族(不一定是之前傳入 lookup 的值)。

出錯(cuò)時(shí),參數(shù) errError 對(duì)象,err.code是錯(cuò)誤代碼。請(qǐng)記住,err.code等于'ENOENT',不僅可能是因?yàn)橛蛎淮嬖?,還有可能是是其他原因,比如沒有可用文件描述符。

dns.lookup 不必和 DNS 協(xié)議有關(guān)系。它使用了操作系統(tǒng)的特性,能將名字和地址關(guān)聯(lián)。

實(shí)現(xiàn)這些東西也許很簡(jiǎn)單,但是對(duì)于 Node.js 程序來說都重要,所以在使用前請(qǐng)花點(diǎn)時(shí)間閱讀Implementation considerations section。

dns.lookupService(address, port, callback)

使用 getnameinfo 解析傳入的地址和端口為域名和服務(wù)。

這個(gè)回調(diào)函數(shù)的參數(shù)是 (err, hostname, service)。 hostnameservice 都是字符串 (比如 'localhost''http')。

出錯(cuò)時(shí),參數(shù)errError 對(duì)象,err.code是錯(cuò)誤代碼。

dns.resolve(hostname[, rrtype], callback)

將一個(gè)域名(如 'google.com')解析為一個(gè) rrtype 指定記錄類型的數(shù)組。

有效的 rrtypes 值為:

  • 'A' (IPV4 地址, 默認(rèn))
  • 'AAAA' (IPV6 地址)
  • 'MX' (郵件交換記錄)
  • 'TXT' (text 記錄)
  • 'SRV' (SRV 記錄)
  • 'PTR' (用來反向 IP 查找)
  • 'NS' (域名服務(wù)器 記錄)
  • 'CNAME' (別名 記錄)
  • 'SOA' (授權(quán)記錄的初始值)

回調(diào)參數(shù)為 (err, addresses). 其中 addresses 中每一項(xiàng)的類型都取決于記錄類型, 詳見下文對(duì)應(yīng)的查找方法。

出錯(cuò)時(shí),參數(shù)errError 對(duì)象,err.code是錯(cuò)誤代碼。

dns.resolve4(hostname, callback)

dns.resolve() 類似, 僅能查詢 IPv4 (A 記錄)。 addresses IPv4 地址數(shù)組 (比如,['74.125.79.104', '74.125.79.105', '74.125.79.106'])。

dns.resolve6(hostname, callback)

dns.resolve4() 類似, 僅能查詢 IPv4( AAAA 查詢)。

dns.resolveMx(hostname, callback)

dns.resolve() 類似, 僅能查詢郵件交換(MX 記錄)。

addresses 是 MX 記錄數(shù)組, 每一個(gè)包含優(yōu)先級(jí)和交換屬性(比如, [{'priority': 10, 'exchange': 'mx.example.com'},...])。

dns.resolveTxt(hostname, callback)

dns.resolve() 類似, 僅能進(jìn)行文本查詢 (TXT 記錄)。 addresses 是 2-d 文本記錄數(shù)組。(比如,[ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ])。 每個(gè)子數(shù)組包含一條記錄的 TXT 塊。根據(jù)使用情況可以連接在一起,也可單獨(dú)使用。

dns.resolveSrv(hostname, callback)

dns.resolve() 類似, 僅能進(jìn)行服務(wù)記錄查詢 (SRV 記錄)。 addresseshostname可用的 SRV 記錄數(shù)組。 SRV 記錄屬性有優(yōu)先級(jí)(priority),權(quán)重(weight), 端口(port), 和名字(name) (比如,[{'priority': 10, 'weight': 5, 'port': 21223, 'name': 'service.example.com'}, ...])。

dns.resolveSoa(hostname, callback)

dns.resolve() 類似, 僅能查詢權(quán)威記錄(SOA 記錄)。

addresses是包含以下結(jié)構(gòu)的對(duì)象:

{
  nsname: 'ns.example.com',
  hostmaster: 'root.example.com',
  serial: 2013101809,
  refresh: 10000,
  retry: 2400,
  expire: 604800,
  minttl: 3600
}

dns.resolveNs(hostname, callback)

dns.resolve() 類似, 僅能進(jìn)行域名服務(wù)器記錄查詢(NS 記錄)。 addresses 是域名服務(wù)器記錄數(shù)組(hostname 可以使用) (比如, ['ns1.example.com', 'ns2.example.com'])。

dns.resolveCname(hostname, callback)

dns.resolve() 類似, 僅能進(jìn)行別名記錄查詢 (CNAME記錄)。addresses 是對(duì) hostname 可用的別名記錄數(shù)組 (比如,, ['bar.example.com'])。

dns.reverse(ip, callback)

反向解析 IP 地址,返回指向該 IP 地址的域名數(shù)組。

回調(diào)函數(shù)參數(shù) (err, hostnames)。

出錯(cuò)時(shí),參數(shù)errError 對(duì)象,err.code是錯(cuò)誤代碼。

dns.getServers()

返回一個(gè)用于當(dāng)前解析的 IP 地址的數(shù)組的字符串。

dns.setServers(servers)

指定一組 IP 地址作為解析服務(wù)器。

如果你給地址指定了端口,端口會(huì)被忽略,因?yàn)榈讓訋?kù)不支持。

傳入無效參數(shù),會(huì)拋出以下錯(cuò)誤:

Error codes

每個(gè) DNS 查詢都可能返回以下錯(cuò)誤:

  • dns.NODATA: DNS 服務(wù)器返回?zé)o數(shù)據(jù)應(yīng)答。
  • dns.FORMERR: DNS 服務(wù)器聲稱查詢格式錯(cuò)誤。
  • dns.SERVFAIL: DNS 服務(wù)器返回一般失敗。
  • dns.NOTFOUND: 沒有找到域名。
  • dns.NOTIMP: DNS 服務(wù)器未實(shí)現(xiàn)請(qǐng)求的操作。
  • dns.REFUSED: DNS 服務(wù)器拒絕查詢。
  • dns.BADQUERY: DNS 查詢格式錯(cuò)誤。
  • dns.BADNAME: 域名格式錯(cuò)誤。
  • dns.BADFAMILY: 地址協(xié)議不支持。
  • dns.BADRESP: DNS 回復(fù)格式錯(cuò)誤。
  • dns.CONNREFUSED: 無法連接到DNS 服務(wù)器。
  • dns.TIMEOUT: 連接DNS 服務(wù)器超時(shí)。
  • dns.EOF: 文件末端。
  • dns.FILE: 讀文件錯(cuò)誤。
  • dns.NOMEM: 內(nèi)存溢出。
  • dns.DESTRUCTION: 通道被摧毀。
  • dns.BADSTR: 字符串格式錯(cuò)誤。
  • dns.BADFLAGS: 非法標(biāo)識(shí)符。
  • dns.NONAME: 所給主機(jī)不是數(shù)字。
  • dns.BADHINTS: 非法HINTS標(biāo)識(shí)符。
  • dns.NOTINITIALIZED: c c-ares 庫(kù)尚未初始化。
  • dns.LOADIPHLPAPI: 加載 iphlpapi.dll 出錯(cuò)。
  • dns.ADDRGETNETWORKPARAMS: 無法找到 GetNetworkParams 函數(shù)。
  • dns.CANCELLED: 取消 DNS 查詢。

支持的 getaddrinfo 標(biāo)志

以下內(nèi)容可作為 hints 標(biāo)志傳給 dns.lookup

  • dns.ADDRCONFIG: 返回當(dāng)前系統(tǒng)支持的地址類型。例如,如果當(dāng)前系統(tǒng)至少配置了一個(gè) IPv4 地址,則返回 IPv4地址。
  • dns.V4MAPPED: 如果指定了 IPv6 家族, 但是沒有找到 IPv6 地址,將返回 IPv4 映射的 IPv6地址。

Implementation considerations

雖然 dns.lookupdns.resolve*/dns.reverse函數(shù)都能實(shí)現(xiàn)網(wǎng)絡(luò)名和網(wǎng)絡(luò)地址的關(guān)聯(lián),但是他們的行為不太一樣。這些不同點(diǎn)雖然很巧妙,但是會(huì)對(duì) Node.js 程序產(chǎn)生顯著的影響。

dns.lookup

dns.lookup 和絕大多數(shù)程序一樣使用了相同的系統(tǒng)特性。例如,dns.lookupping 命令用相同的方法解析了一個(gè)指定的名字。多數(shù)類似 POSIX 的系統(tǒng),dns.lookup 函數(shù)可以通過改變nsswitch.conf(5) 和/或 resolv.conf(5) 的設(shè)置調(diào)整。如果改變這些文件將會(huì)影響系統(tǒng)里的其他應(yīng)用。

雖然,JavaScript 調(diào)用是異步的,它的實(shí)現(xiàn)是同步的調(diào)用 libuv 線程池里的getaddrinfo(3) 。因?yàn)?libuv 線程池固定大小,所以如果調(diào)用 getaddrinfo(3) 的時(shí)間太長(zhǎng),會(huì)使的池里的其他操作(比如文件操作)性能降低。為了降低這個(gè)風(fēng)險(xiǎn),可以通過增加 'UV_THREADPOOL_SIZE' 的值,讓它超過4,來調(diào)整libuv線程池大小,更多信息參見[the official libuv documentation](http://docs.libuv.org/en/latest/threadpool.html)。

dns.resolve, functions starting with dns.resolve and dns.reverse

這些函數(shù)的實(shí)現(xiàn)和dns.lookup 不大相同。他們不會(huì)用到 getaddrinfo(3),而是始終進(jìn)行網(wǎng)絡(luò)查詢。這些操作都是異步的,和libuv線程池?zé)o關(guān)。

因此,這些操作對(duì)于其他線程不會(huì)產(chǎn)生負(fù)面影響,這和 dns.lookup 不同。

它們不會(huì)用到 dns.lookup 的配置文件(例如 /etc/hosts_)。

上一篇:概述下一篇:Query String