穩(wěn)定性: 3 - 穩(wěn)定
調用 require('dns')
可以訪問這個模塊。
這個模塊包含的函數屬于2個不同的分類:
1)使用系統(tǒng)底層的特性,完成名字解析,這個過程不需要網絡通訊,這個分類僅有一個函數: dns.lookup
。開發(fā)者在同一個系統(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 服務器進行名字解析,始終使用網絡來進行域名查詢。這個分類包含除了 dns.lookup
外的所有函數。這些函數不會和 dns.lookup
使用同一套配置文件。如果你不想使用系統(tǒng)底層的特性來進行名字解析,而想進行 DNS 查詢的話,可以用這個分類的函數。
下面的例子,解析了'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)); }); }); });
更多細節(jié)參考Implementation considerations section。
將域名(比如 'google.com'
)解析為第一條找到的記錄 A (IPV4)或 AAAA(IPV6)。參數 options
可以是一個對象或整數。如果沒有提供 options
,IP v4 和 v6 地址都可以。如果 options
是整數,則必須是 4
或 6
。
options
參數可能是包含 family
和 hints
兩個屬性的對象。這兩個屬性都是可選的。如果提供了 family
,則必須是 4
或 6
,否則,IP v4 和 v6 地址都可以。如果提供了 hints
,可以是一個或者多個 getaddrinfo
標志,若不提供,沒有標志會傳給 getaddrinfo
。多個標志位可以通過或運算來整合。以下的例子展示如何使用 options
。
{ family: 4, hints: dns.ADDRCONFIG | dns.V4MAPPED }
參見 supported getaddrinfo
flags 查看更多的標志位。
回調函數包含參數 (err, address, family)
。 address
參數表示 IP v4 或 v6 地址。family
參數是4 或 6,表示 address
家族(不一定是之前傳入 lookup 的值)。
出錯時,參數 err
是 Error
對象,err.code
是錯誤代碼。請記住,err.code
等于'ENOENT'
,不僅可能是因為域名不存在,還有可能是是其他原因,比如沒有可用文件描述符。
dns.lookup
不必和 DNS 協(xié)議有關系。它使用了操作系統(tǒng)的特性,能將名字和地址關聯。
實現這些東西也許很簡單,但是對于 Node.js 程序來說都重要,所以在使用前請花點時間閱讀Implementation considerations section。
使用 getnameinfo
解析傳入的地址和端口為域名和服務。
這個回調函數的參數是 (err, hostname, service)
。 hostname
和 service
都是字符串 (比如 'localhost'
和 'http'
)。
出錯時,參數err
是 Error
對象,err.code
是錯誤代碼。
將一個域名(如 'google.com')解析為一個 rrtype 指定記錄類型的數組。
有效的 rrtypes 值為:
'A'
(IPV4 地址, 默認)
'AAAA'
(IPV6 地址)
'MX'
(郵件交換記錄)
'TXT'
(text 記錄)
'SRV'
(SRV 記錄)
'PTR'
(用來反向 IP 查找)
'NS'
(域名服務器 記錄)
'CNAME'
(別名 記錄)
'SOA'
(授權記錄的初始值)
回調參數為 (err, addresses)
. 其中 addresses
中每一項的類型都取決于記錄類型, 詳見下文對應的查找方法。
出錯時,參數err
是 Error
對象,err.code
是錯誤代碼。
和 dns.resolve()
類似, 僅能查詢 IPv4 (A
記錄)。addresses
IPv4 地址數組 (比如,['74.125.79.104', '74.125.79.105', '74.125.79.106']
)。
和 dns.resolve4()
類似, 僅能查詢 IPv4( AAAA
查詢)。
和 dns.resolve()
類似, 僅能查詢郵件交換(MX
記錄)。
addresses
是 MX 記錄數組, 每一個包含優(yōu)先級和交換屬性(比如, [{'priority': 10, 'exchange': 'mx.example.com'},...]
)。
和 dns.resolve()
類似, 僅能進行文本查詢 (TXT
記錄)。addresses
是 2-d 文本記錄數組。(比如,[ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]
)。 每個子數組包含一條記錄的 TXT 塊。根據使用情況可以連接在一起,也可單獨使用。
和 dns.resolve()
類似, 僅能進行服務記錄查詢 (SRV
記錄)。addresses
是 hostname
可用的 SRV 記錄數組。 SRV 記錄屬性有優(yōu)先級(priority),權重(weight), 端口(port), 和名字(name) (比如,[{'priority': 10, 'weight': 5, 'port': 21223, 'name': 'service.example.com'}, ...]
)。
和 dns.resolve()
類似, 僅能查詢權威記錄(SOA
記錄)。
addresses
是包含以下結構的對象:
{ nsname: 'ns.example.com', hostmaster: 'root.example.com', serial: 2013101809, refresh: 10000, retry: 2400, expire: 604800, minttl: 3600 }
和 dns.resolve()
類似, 僅能進行域名服務器記錄查詢(NS
記錄)。addresses
是域名服務器記錄數組(hostname
可以使用) (比如, ['ns1.example.com', 'ns2.example.com']
)。
和 dns.resolve()
類似, 僅能進行別名記錄查詢 (CNAME
記錄)。addresses
是對 hostname
可用的別名記錄數組 (比如,, ['bar.example.com']
)。
反向解析 IP 地址,返回指向該 IP 地址的域名數組。
回調函數參數 (err, hostnames)
。
出錯時,參數err
是 Error
對象,err.code
是錯誤代碼。
返回一個用于當前解析的 IP 地址的數組的字符串。
指定一組 IP 地址作為解析服務器。
如果你給地址指定了端口,端口會被忽略,因為底層庫不支持。
傳入無效參數,會拋出以下錯誤:
每個 DNS 查詢都可能返回以下錯誤:
dns.NODATA
: DNS 服務器返回無數據應答。
dns.FORMERR
: DNS 服務器聲稱查詢格式錯誤。
dns.SERVFAIL
: DNS 服務器返回一般失敗。
dns.NOTFOUND
: 沒有找到域名。
dns.NOTIMP
: DNS 服務器未實現請求的操作。
dns.REFUSED
: DNS 服務器拒絕查詢。
dns.BADQUERY
: DNS 查詢格式錯誤。
dns.BADNAME
: 域名格式錯誤。
dns.BADFAMILY
: 地址協(xié)議不支持。
dns.BADRESP
: DNS 回復格式錯誤。
dns.CONNREFUSED
: 無法連接到DNS 服務器。
dns.TIMEOUT
: 連接DNS 服務器超時。
dns.EOF
: 文件末端。
dns.FILE
: 讀文件錯誤。
dns.NOMEM
: 內存溢出。
dns.DESTRUCTION
: 通道被摧毀。
dns.BADSTR
: 字符串格式錯誤。
dns.BADFLAGS
: 非法標識符。
dns.NONAME
: 所給主機不是數字。
dns.BADHINTS
: 非法HINTS標識符。
dns.NOTINITIALIZED
: c c-ares 庫尚未初始化。
dns.LOADIPHLPAPI
: 加載 iphlpapi.dll 出錯。
dns.ADDRGETNETWORKPARAMS
: 無法找到 GetNetworkParams 函數。
dns.CANCELLED
: 取消 DNS 查詢。
以下內容可作為 hints 標志傳給 dns.lookup
dns.ADDRCONFIG
: 返回當前系統(tǒng)支持的地址類型。例如,如果當前系統(tǒng)至少配置了一個 IPv4 地址,則返回 IPv4地址。
dns.V4MAPPED
: 如果指定了 IPv6 家族, 但是沒有找到 IPv6 地址,將返回 IPv4 映射的 IPv6地址。
雖然 dns.lookup
和 dns.resolve*/dns.reverse
函數都能實現網絡名和網絡地址的關聯,但是他們的行為不太一樣。這些不同點雖然很巧妙,但是會對 Node.js 程序產生顯著的影響。
dns.lookup
和絕大多數程序一樣使用了相同的系統(tǒng)特性。例如,dns.lookup
和 ping
命令用相同的方法解析了一個指定的名字。多數類似 POSIX 的系統(tǒng),dns.lookup
函數可以通過改變nsswitch.conf(5)
和/或 resolv.conf(5)
的設置調整。如果改變這些文件將會影響系統(tǒng)里的其他應用。
雖然,JavaScript 調用是異步的,它的實現是同步的調用 libuv 線程池里的getaddrinfo(3)
。因為 libuv 線程池固定大小,所以如果調用 getaddrinfo(3)
的時間太長,會使的池里的其他操作(比如文件操作)性能降低。為了降低這個風險,可以通過增加 'UV_THREADPOOL_SIZE' 的值,讓它超過4,來調整libuv線程池大小,更多信息參見[the official libuv
documentation](<a rel="nofollow" href="http://docs.libuv.org/en/latest/threadpool.html"">http://docs.libuv.org/en/latest/threadpool.html)。
這些函數的實現和dns.lookup
不大相同。他們不會用到 getaddrinfo(3)
,而是始終進行網絡查詢。這些操作都是異步的,和libuv線程池無關。
因此,這些操作對于其他線程不會產生負面影響,這和 dns.lookup
不同。
它們不會用到 dns.lookup
的配置文件(例如 /etc/hosts
_)。