# DNS
~~~
穩定度: 3 - 穩定
~~~
使用 `require('dns')` 引入此模塊。dns 模塊中的所有方法都使用了 C-Ares,除了 `dns.lookup` 使用了線程池中的 `getaddrinfo(3)`。C-Ares 比 `getaddrinfo` 要快得多,但系統解析器相對于其它程序的操作要更固定。當一個用戶使用 `net.connect(80, 'google.com')` 或 `http.get({ host: 'google.com' })` 時會使用 `dns.lookup` 方法。如果用戶需要進行大量的快速查詢,則最好使用 C-Ares 提供的方法。
下面是一個解析 `'www.google.com'` 并反向解析所返回 IP 地址的例子。
~~~
console.log('反向解析 ' + a + ': ' + JSON.stringify(domains));
});
});
});
~~~
### dns.lookup(domain, [family], callback)
將一個域名(比如 `'google.com'`)解析為第一個找到的 A 記錄(IPv4)或 AAAA 記錄(IPv6)。地址族 `family` 可以是數字 `4` 或 `6`,缺省為 `null` 表示同時允許 IPv4 和 IPv6 地址族。
回調參數為 `(err, address, family)`。地址 `address` 參數為一個代表 IPv4 或 IPv6 地址的字符串。地址族 `family` 參數為數字 4 或 6,地表 `address` 的地址族(不一定是之前傳入 `lookup` 的值)。
當錯誤發生時,`err` 為一個 `Error` 對象,其中 `err.code` 為錯誤代碼。請記住 `err.code` 被設定為 `'ENOENT'` 的情況不僅是域名不存在,也可能是查詢在其它途徑出錯,比如沒有可用文件描述符時。
### dns.resolve(domain, [rrtype], callback)
將一個域名(比如 `'google.com'`)解析為一個 `rrtype` 指定記錄類型的數組。有效 `rrtypes` 取值有 `'A'`(IPv4 地址,缺省)、`'AAAA'`(IPv6 地址)、`'MX'`(郵件交換記錄)、`'TXT'`(文本記錄)、`'SRV'`(SRV 記錄)、`'PTR'`(用于 IP 反向查找)、`'NS'`(域名服務器記錄)和 `'CNAME'`(別名記錄)。
回調參數為 `(err, addresses)`。其中 `addresses` 中每一項的類型取決于記錄類型,詳見下文對應的查找方法。
當出錯時,`err` 參數為一個 `Error` 對象,其中 `err.code` 為下文所列出的錯誤代碼之一。
### dns.resolve4(domain, callback)
于 `dns.resolve()` 一樣,但只用于查詢 IPv4(`A` 記錄)。`addresses` 是一個 IPv4 地址的數組(比如 `['74.125.79.104', '74.125.79.105', '74.125.79.106']`)。
### dns.resolve6(domain, callback)
類似于 `dns.resolve4()`,但用于 IPv6(`AAAA`)查詢。
### dns.resolveMx(domain, callback)
類似于 `dns.resolve()`,但用于郵件交換查詢(`MX` 記錄)。
`addresses` 為一個 MX 記錄的數組,每一項包含優先級和交換屬性(比如 `[{'priority': 10, 'exchange': 'mx.example.com'},...]`)。
### dns.resolveTxt(domain, callback)
與 `dns.resolve()` 相似,但用于文本查詢(`TXT` 記錄)。`addresses` 為 `domain` 可用文本記錄的數組(比如 `['v=spf1 ip4:0.0.0.0 ~all']`)。
### dns.resolveSrv(domain, callback)
查詢 SRV 記錄,與 `dns.resolve()` 相似。 `addresses` 是域名 `domain` 可用的 SRV 記錄數組, 每一條記錄都包含優先級(priority)、權重(weight)、端口號(port)、服務名稱(name)等屬性 (比如: `[{'priority': 10, {'weight': 5, 'port': 21223, 'name': 'service.example.com'}, ...]`)。
### dns.resolveNs(domain, callback)
查詢 NS 記錄,與 `dns.resolve()` 相似。 `addresses` 是域名 `domain` 可用的 NS 記錄數組, (比如: `['ns1.example.com', 'ns2.example.com']`).
### dns.resolveCname(domain, callback)
查詢 CNAME 記錄,與 `dns.resolve()` 相似。 `addresses` 是域名 `domain` 可用的 CNAME 記錄數組, (比如: `['bar.example.com']`).
### dns.reverse(ip, callback)
反向解析 IP 地址,返回指向該 IP 地址的域名數組。
回調函數接收兩個參數: `(err, domains)`.
當出錯時,`err` 參數為一個 `Error` 對象,其中 `err.code` 為下文所列出的錯誤代碼之一。
### dns.getServers()
已字符串返回一個當前用于解析的 IP 地址的數組。
### dns.setServers(servers)
指定一個 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`: 不支持的地址類型。
- `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`: 指定了非法提示標記。
- `dns.NOTINITIALIZED`: c-ares 庫初始化尚未進行。
- `dns.LOADIPHLPAPI`: 加載 iphlpapi.dll 出錯。
- `dns.ADDRGETNETWORKPARAMS`: 無法找到 GetNetworkParams 函數。
- `dns.CANCELLED`: DNS 查詢取消。