Node.js DNS 模組:網域名稱解析與紀錄查詢
在進行任何網路傳輸之前,電腦必須先將人類可讀的網域名稱(如 google.com)轉換為機器識別的 IP 地址。Node.js 的 dns 模組提供了與作業系統及網路 DNS 伺服器互動的能力。
兩個層次的解析方式
理解 DNS 模組的關鍵在於區分 lookup 與 resolve:
1. dns.lookup():系統層級解析
它使用作業系統底層的設定(例如 /etc/hosts 檔案)。如果你想知道「這台電腦會把這個網址指向哪裡」,就用它。
- 特性:它在執行緒池 (Thread Pool) 中同步呼叫 getaddrinfo(3)。
const dns = require('dns');
dns.lookup('google.com', (err, address, family) => {
console.log('IP 地址:', address); // 142.251...
console.log('IP 類型: IPv', family);
});
2. dns.resolve():網路層級查詢
它直接向網路上的 DNS 伺服器發送查詢請求,完全繞過本地的主機設定檔。
// 使用推薦的 Promises 版本
const dns = require('dns/promises');
async function getRecords(domain) {
try {
const addresses = await dns.resolve4(domain); // 查詢 IPv4 (A 紀錄)
console.log(`${domain} 的所有 A 紀錄:`, addresses);
} catch (err) {
console.error('查詢失敗');
}
}
實戰:查詢特定的 DNS 紀錄
除了查 IP 地址,dns.resolve 還能獲取更豐富的網域資訊:
- MX 紀錄 (郵件伺服器):驗證網域是否具備收信能力。
- TXT 紀錄:常用於 Google、Facebook 的網域所有權驗證。
- NS 紀錄:查詢該網域的名稱伺服器。
async function checkMailServer() {
const mxRecords = await dns.resolveMx('gmail.com');
console.log('Gmail 的郵件交換伺服器:', mxRecords);
}
async function checkTxtRecords() {
const txt = await dns.resolveTxt('google.com');
console.log('TXT 紀錄內容:', txt);
}
反向 DNS 查詢 (Reverse DNS)
如果你拿到一個 IP 位址,想知道它背後對應的網域名稱是什麼,可以使用 reverse()。
const hostnames = await dns.reverse('8.8.8.8');
console.log('該 IP 的主機名稱為:', hostnames); // [ 'dns.google' ]
Lookup vs Resolve 比較表
| 特性 | dns.lookup() | dns.resolve() |
|---|---|---|
| 資料來源 | 本地 hosts 檔案 + 解析器 | 直接發送到 DNS 伺服器 |
| 運作機制 | 佔用 Thread Pool (同步轉換) | 純非同步網路呼叫 |
| 主要功能 | 取得實際連線用的 IP | 取得各種 DNS 詳細紀錄 |
| 推薦場景 | 應用程式發送 HTTP 請求時 | 開發偵錯工具、網域驗證系統 |
總結
- 絕大多數的網路連線建議直接使用
dns.lookup()或交由http模組自動處理。 - 當你需要精確的 DNS 紀錄(如 MX, TXT)時,
dns.resolve是唯一的選擇。 - 全面採用
dns/promises能讓你的網路檢測腳本變得更簡潔好讀。