# Node.js DNS 模塊
Node.js **DNS** 模塊用于解析域名。引入 DNS 模塊語法格式如下:
```
var dns = require("dns")
```
## 方法
| 方法 | 描述 |
| --- | --- |
| **dns.lookup(hostname[, options], callback)** | 將域名(比如 'runoob.com')解析為第一條找到的記錄 A (IPV4)或 AAAA(IPV6)。參數 options可以是一個對象或整數。如果沒有提供 options,IP v4 和 v6 地址都可以。如果 options 是整數,則必須是 4 或 6。 |
| **dns.lookupService(address, port, callback)** | 使用 getnameinfo 解析傳入的地址和端口為域名和服務。 |
| **dns.resolve(hostname[, rrtype], callback)** | 將一個域名(如 'runoob.com')解析為一個 rrtype 指定記錄類型的數組。 |
| **dns.resolve4(hostname, callback)** | 和 dns.resolve() 類似, 僅能查詢 IPv4 (A 記錄)。 addresses IPv4 地址數組 (比如,['74.125.79.104', '74.125.79.105', '74.125.79.106'])。 |
| **dns.resolve6(hostname, callback)** | 和 dns.resolve4() 類似, 僅能查詢 IPv6( AAAA 查詢) |
| **dns.resolveMx(hostname, callback)** | 和 dns.resolve() 類似, 僅能查詢郵件交換(MX 記錄)。 |
| **dns.resolveTxt(hostname, callback)** | 和 dns.resolve() 類似, 僅能進行文本查詢 (TXT 記錄)。 addresses 是 2-d 文本記錄數組。(比如,[ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ])。 每個子數組包含一條記錄的 TXT 塊。根據使用情況可以連接在一起,也可單獨使用。 |
| **dns.resolveSrv(hostname, callback)** | 和 dns.resolve() 類似, 僅能進行服務記錄查詢 (SRV 記錄)。 addresses 是 hostname可用的 SRV 記錄數組。 SRV 記錄屬性有優先級(priority),權重(weight), 端口(port), 和名字(name) (比如,[{'priority': 10, 'weight': 5, 'port': 21223, 'name': 'service.example.com'}, ...])。 |
| **dns.resolveSoa(hostname, callback)** | 和 dns.resolve() 類似, 僅能查詢權威記錄(SOA 記錄)。 |
| **dns.resolveNs(hostname, callback)** | 和 dns.resolve() 類似, 僅能進行域名服務器記錄查詢(NS 記錄)。 addresses 是域名服務器記錄數組(hostname 可以使用) (比如, ['ns1.example.com', 'ns2.example.com'])。 |
| **dns.resolveCname(hostname, callback)** | 和 dns.resolve() 類似, 僅能進行別名記錄查詢 (CNAME記錄)。addresses 是對 hostname 可用的別名記錄數組 (比如,, ['bar.example.com'])。 |
| **dns.reverse(ip, callback)** | 反向解析 IP 地址,指向該 IP 地址的域名數組。 |
| **dns.getServers()** | 返回一個用于當前解析的 IP 地址數組的字符串。 |
| **dns.setServers(servers)** | 指定一組 IP 地址作為解析服務器。 |
### rrtypes
以下列出了 dns.resolve() 方法中有效的 rrtypes值:
* `'A'` IPV4 地址, 默認
* `'AAAA'` IPV6 地址
* `'MX'` 郵件交換記錄
* `'TXT'` text 記錄
* `'SRV'` SRV 記錄
* `'PTR'` 用來反向 IP 查找
* `'NS'` 域名服務器記錄
* `'CNAME'` 別名記錄
* `'SOA'` 授權記錄的初始值
## 錯誤碼
每次 DNS 查詢都可能返回以下錯誤碼:
* `dns.NODATA`: 無數據響應。
* `dns.FORMERR`: 查詢格式錯誤。
* `dns.SERVFAIL`: 常規失敗。
* `dns.NOTFOUND`: 沒有找到域名。
* `dns.NOTIMP`: 未實現請求的操作。
* `dns.REFUSED`: 拒絕查詢。
* `dns.BADQUERY`: 查詢格式錯誤。
* `dns.BADNAME`: 域名格式錯誤。
* `dns.BADFAMILY`: 地址協議不支持。
* `dns.BADRESP`: 回復格式錯誤。
* `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 查詢。
### 實例
創建 main.js 文件,代碼如下所示:
```
var dns = require('dns');
dns.lookup('www.github.com', function onLookup(err, address, family) {
console.log('ip 地址:', address);
dns.reverse(address, function (err, hostnames) {
if (err) {
console.log(err.stack);
}
console.log('反向解析 ' + address + ': ' + JSON.stringify(hostnames));
});
});
```
執行以上代碼,結果如下所示:
```
address: 192.30.252.130
reverse for 192.30.252.130: ["github.com"]
```
- Node.js 簡介
- Node.js 安裝配置
- Node.js 創建第一個應用
- NPM 使用介紹
- Node.js REPL(交互式解釋器)
- Node.js 回調函數
- Node.js 事件循環
- Node.js EventEmitter
- Node.js Buffer(緩沖區)
- Node.js Stream(流)
- Node.js模塊系統
- Node.js 函數
- Node.js 路由
- Node.js 全局對象
- Node.js 常用工具 util
- Node.js 文件系統
- Node.js GET/POST請求
- Node.js 工具模塊
- Node.js OS 模塊
- Node.js Path 模塊
- Node.js Net 模塊
- Node.js DNS 模塊
- Node.js Domain 模塊
- Node.js Web 模塊
- Node.js Express 框架
- Node.js RESTful API
- Node.js 多進程
- Node.js JXcore 打包
- 免責聲明