Node.js中DNS模塊學(xué)習(xí)總結(jié)
1. DNS
在Node.js中,提供DNS模塊,以實(shí)現(xiàn)域名查找及域名解析的處理。
- 在DNS模塊中,提供了三個主方法及一系列便捷方法。
- resolve方法:用于將一個域名解析為一組DNS記錄。
- reverse方法: 用于將IP地址轉(zhuǎn)換為一組域名。
- lookup方法: 用于將一個域名轉(zhuǎn)換成IP地址。
- DNS模塊中的其余便捷方法均為resolve方法的一種便捷形式。
2. 使用resolve方法將域名解析為DNS記錄
`DNS.resolve(domain, [rrtype], callback(err, address){...})`
domain參數(shù)為一個字符串,用于指定需要被解析的域名,可以包括子域名。
rrtypr參數(shù)為一個字符串,用于指定需要獲取的記錄類型,可指定的記錄類型如下。
- A,該參數(shù)值為默認(rèn)值,當(dāng)記錄類型為A時,該記錄將一個IPv4地址映射為一個域名。
- AAAA,當(dāng)記錄類型為AAAA時,該記錄將一個IPv6地址映射為一個域名。
- CNAME,當(dāng)記錄類型為CNAME時,表示該記錄為一個域名的別名記錄,例如,一個www.example.com域名記錄也許為一個example.com域名記錄額別名記錄。
- MX,MX記錄指向一個使用SMTP的域中的郵件服務(wù)器,例如,當(dāng)你想person@domain.com郵件地址發(fā)送電子郵件時,domain.com域的MX記錄中保存了發(fā)送該郵件時的郵件服務(wù)器地址。
- TXT,TXT記錄是為該域名附加的描述記錄。
- SRV,SRV記錄用于為一個特定域中所有可用服務(wù)提供信息。
- PTR,PTR記錄用于反向地址解析,該記錄將一個域名映射為一個IPv4地址。
- NS,NS(Name Server)記錄是域名服務(wù)器記錄,用來指定該域名由哪個DNS服務(wù)器進(jìn)行解析。
回調(diào)函數(shù)有兩個參數(shù),err是域名解析失敗時觸發(fā)的錯誤對象,addresses參數(shù)為一個數(shù)組,其中存放了所有獲取到的DNS記錄。
3. 為resolve方法定制的各種便捷方法
- DNS.resolve4(domain, callback),獲取IPv4地址
- DNS.resolve6(domain, callback),獲取IPv6地址
- DNS.resolveMx(domain, callback),獲取MX記錄,郵件交換服務(wù)器記錄
- DNS.resolveTxt(domain, callback),獲取TXT記錄,域名附加的描述記錄
- DNS.resolveSrv(domain, callback),獲取SRV記錄,服務(wù)記錄
- DNS.resolveNs(domain, callback),獲取NS記錄,域名服務(wù)器記錄
- DNS.resolveCname(domain, callback),獲取別名記錄
4. 使用lookup方法查詢IP地址
當(dāng)使用resolve4方法或者resolve6方法時,由于callback參數(shù)值回調(diào)函數(shù)中的addresses參數(shù)值數(shù)組中存放著所有獲取到的IPv4地址或IPv6地址。因此DNS模塊中提供了一個獲取第一個被發(fā)現(xiàn)的IPv4地址或者IPv6地址的lookup方法
`DNS.lookup(domain, [family], callback(err, addresses, family){...})`
- domain參數(shù)為一個字符串,用于指定需要解析的域名
- family參數(shù)值為一個整數(shù)值,用于指定需要獲取的IP地址類型,可指定的參數(shù)值為4或6,默認(rèn)參數(shù)值為null,表示既可以獲取IPv4,又可以獲取IPv6
- 回調(diào)函數(shù)err參數(shù)值為獲取地址失敗時觸發(fā)的錯誤對象,當(dāng)域名不存在或查詢失敗時該錯誤對象的code屬性值為ENOENT
- addresses參數(shù)值為一個字符串,為獲取到的IP地址
- family參數(shù)值為4時,表示為一個IPv4地址,為6時,表示為一個IPv6地址。
5. 使用reverse方法反向解析IP地址
在DNS模塊中,使用reverse方法將一個IP地址反向解析為一組與該IP地址綁定的域名
`DNS.reverse(ip, callback(err, domains){...})`
- ip參數(shù)值為一個字符串,用于指定需要解析的IP地址
- 回調(diào)函數(shù)的err為反向解析地址失敗后的錯誤對象
- domains參數(shù)值為一個數(shù)組,存放了所有獲取到的域名
6. DNS模塊中的各種錯誤代碼
err參數(shù)值為執(zhí)行各種解析或反向解析操作時觸發(fā)的錯誤對象,可根據(jù)該錯誤對象的code屬性值,即觸發(fā)的錯誤代號判斷出發(fā)了什么錯誤
- ENODATA:DNS服務(wù)器返回一個沒有數(shù)據(jù)的查詢結(jié)果
- EFORMERR:DNS服務(wù)器發(fā)現(xiàn)客戶端請求查詢時使用了格式錯誤的查詢參數(shù)
- ESERVFAIL:DNS服務(wù)器執(zhí)行查詢操作失敗
- ENOTFOUND:未發(fā)現(xiàn)任何域名
- ENOTIMP:DNS服務(wù)器不能進(jìn)行客戶端所請求的查詢操作
- EREFUSED:DNS服務(wù)器拒絕進(jìn)行查詢操作
- EBADQUERY:格式錯誤的DNS查詢
- EBADNAME:域名格式錯誤
- EBADFAMILY:不支持的IP地址類型
- EBADRESP:DNS答復(fù)的格式錯誤
- ECONNREFUSED:不能建立與DNS服務(wù)器之間的連接
- ETIMEOUT:與DNS服務(wù)器之間建立連接超時
- EEOF:已到達(dá)文件底部
- EFILE:讀取文件失敗
- ENOMEM:沒有足夠的內(nèi)存空間
- EDESTRUCTION:通道已經(jīng)被銷毀
- EBADSTR:字符串格式錯誤
- EBADFLAGS:指定了錯誤的判斷標(biāo)志
- ENONAME:指定的主機(jī)名不是數(shù)值格式的
- EBADHINTS:指定的提示標(biāo)志無效
- ENOTINITIALIZED:c-ares類庫初始化工作尚未完成
- ELOADIPHLPAPI:加載iphlpapi.dll時觸發(fā)了一個錯誤
- EADDREGETNETWORKPARAMS:未發(fā)現(xiàn)GetNetworkParams函數(shù)
- ECANCELLED:DNS查詢操作被取消
7. DNS模塊的基本使用
const dns = require('dns'); let url = 'www.qq.com'; dns.resolve(url, 'A', (err, addresses) => { console.log(addresses); // IPv4地址 [ '103.7.30.123' ] }); dns.resolve(url, 'AAAA', (err, addresses) => { console.log(addresses); // IPv6地址 [ '240e:e1:8100:28::2:16' ] }); dns.resolveMx('qq.com', (err, addresses) => { console.log(addresses); // 郵件交換服務(wù)器記錄 // [ { exchange: 'mx2.qq.com', priority: 20 }, // { exchange: 'mx1.qq.com', priority: 30 }, // { exchange: 'mx3.qq.com', priority: 10 } ] }); dns.resolveTxt('qq.com', (err, addresses) => { console.log(addresses); // 域名附加的描述記錄 // [ [ 'v=spf1 include:spf.mail.qq.com -all' ] ] }); dns.resolveSrv('www.baidu.com', (err, addresses) => { console.log(addresses); // 服務(wù)記錄 // [] }); dns.resolveNs('www.github.com', (err, addresses) => { console.log(addresses); // 域名服務(wù)器記錄 // [ 'ns-421.awsdns-52.com', // 'ns-520.awsdns-01.net', // 'ns1.p16.dynect.net', // 'ns2.p16.dynect.net', // 'ns3.p16.dynect.net', // 'ns4.p16.dynect.net', // 'ns-1283.awsdns-32.org', // 'ns-1707.awsdns-21.co.uk' ] }); dns.resolveCname('www.163.com', (err, addresses) => { console.log(addresses); // 獲取別名記錄 // [ 'www.163.com.lxdns.com' ] }); dns.lookup('google.com', 4, (err, address, family) => { // 查詢IP地址 // address,查詢到的地址 // family,IPv4或IPv6 console.log(address);// 172.217.27.142 console.log(family);// 4 }); dns.lookup('google.com', 6, (err, address, family) => { console.log(address);// 2404:6800:4008:803::200e console.log(family);// 6 }); dns.reverse('203.188.200.67', (err, domain) => { // 反向解析IP地址 console.log(domain); // [ 'media-router-fp1.prod.media.vip.tp2.yahoo.com' ] });
相關(guān)文章
基于Express實(shí)現(xiàn)遞歸遍歷文件和CRUD操作
在現(xiàn)代的?Web?應(yīng)用開發(fā)中,文件管理是一個常見而重要的需求,所以本文就來講講如何利用?Express?框架,在遞歸遍歷文件之后實(shí)現(xiàn)強(qiáng)大的?CRUD?操作,構(gòu)建一個功能完善的文件管理系統(tǒng),感興趣的可以了解一下2023-06-06node?NPM庫增強(qiáng)版globby?Promise使用學(xué)習(xí)
這篇文章主要為大家介紹了node?NPM庫增強(qiáng)版globby?Promise使用學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07用node開發(fā)并發(fā)布一個cli工具的方法步驟
這篇文章主要介紹了用node開發(fā)并發(fā)布一個cli工具的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01express express-session的使用小結(jié)
這篇文章主要介紹了express express-session的使用小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12async/await與promise(nodejs中的異步操作問題)
這篇文章主要介紹了async/await與promise(nodejs中的異步操作問題),非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-03-03Node 搭建一個靜態(tài)資源服務(wù)器的實(shí)現(xiàn)
這篇文章主要介紹了Node 搭建一個靜態(tài)資源服務(wù)器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05node.js根據(jù)不同請求路徑返回不同數(shù)據(jù)詳解流程
本篇文章介紹了我在開發(fā)過程中發(fā)現(xiàn)的一個小問題,就是node.js如何能夠根據(jù)不同的請求路徑來返回得到不同數(shù)據(jù),通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下2021-10-10