穩(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。
將域名(比如 'google.com'
)解析為第一條找到的記錄 A (IPV4)或 AAAA(IPV6)。參數(shù) options
可以是一個(gè)對(duì)象或整數(shù)。如果沒有提供 options
,IP v4 和 v6 地址都可以。如果 options
是整數(shù),則必須是 4
或 6
。
options
參數(shù)可能是包含 family
和 hints
兩個(gè)屬性的對(duì)象。這兩個(gè)屬性都是可選的。如果提供了 family
,則必須是 4
或 6
,否則,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ù) err
是 Error
對(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。
使用 getnameinfo
解析傳入的地址和端口為域名和服務(wù)。
這個(gè)回調(diào)函數(shù)的參數(shù)是 (err, hostname, service)
。 hostname
和 service
都是字符串 (比如 'localhost'
和 'http'
)。
出錯(cuò)時(shí),參數(shù)err
是 Error
對(duì)象,err.code
是錯(cuò)誤代碼。
將一個(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ù)err
是 Error
對(duì)象,err.code
是錯(cuò)誤代碼。
和 dns.resolve()
類似, 僅能查詢 IPv4 (A
記錄)。
addresses
IPv4 地址數(shù)組 (比如,['74.125.79.104', '74.125.79.105', '74.125.79.106']
)。
和 dns.resolve4()
類似, 僅能查詢 IPv4( AAAA
查詢)。
和 dns.resolve()
類似, 僅能查詢郵件交換(MX
記錄)。
addresses
是 MX 記錄數(shù)組, 每一個(gè)包含優(yōu)先級(jí)和交換屬性(比如, [{'priority': 10, 'exchange': 'mx.example.com'},...]
)。
和 dns.resolve()
類似, 僅能進(jìn)行文本查詢 (TXT
記錄)。
addresses
是 2-d 文本記錄數(shù)組。(比如,[ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]
)。 每個(gè)子數(shù)組包含一條記錄的 TXT 塊。根據(jù)使用情況可以連接在一起,也可單獨(dú)使用。
和 dns.resolve()
類似, 僅能進(jìn)行服務(wù)記錄查詢 (SRV
記錄)。
addresses
是 hostname
可用的 SRV 記錄數(shù)組。 SRV 記錄屬性有優(yōu)先級(jí)(priority),權(quán)重(weight), 端口(port), 和名字(name) (比如,[{'priority': 10, 'weight': 5, 'port': 21223, 'name': 'service.example.com'}, ...]
)。
和 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.resolve()
類似, 僅能進(jìn)行域名服務(wù)器記錄查詢(NS
記錄)。
addresses
是域名服務(wù)器記錄數(shù)組(hostname
可以使用) (比如, ['ns1.example.com', 'ns2.example.com']
)。
和 dns.resolve()
類似, 僅能進(jìn)行別名記錄查詢 (CNAME
記錄)。addresses
是對(duì) hostname
可用的別名記錄數(shù)組 (比如,, ['bar.example.com']
)。
反向解析 IP 地址,返回指向該 IP 地址的域名數(shù)組。
回調(diào)函數(shù)參數(shù) (err, hostnames)
。
出錯(cuò)時(shí),參數(shù)err
是 Error
對(duì)象,err.code
是錯(cuò)誤代碼。
返回一個(gè)用于當(dāng)前解析的 IP 地址的數(shù)組的字符串。
指定一組 IP 地址作為解析服務(wù)器。
如果你給地址指定了端口,端口會(huì)被忽略,因?yàn)榈讓訋?kù)不支持。
傳入無效參數(shù),會(huì)拋出以下錯(cuò)誤:
每個(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 查詢。 以下內(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地址。雖然 dns.lookup
和 dns.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
和絕大多數(shù)程序一樣使用了相同的系統(tǒng)特性。例如,dns.lookup
和 ping
命令用相同的方法解析了一個(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)。
這些函數(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
_)。