- NodeJs的介绍及使用
- Node.js核心模块概览
- NodeJs-Assertion Testing
- NodeJs-Asynchronous Context Tracking
- NodeJs-async_hooks
- NodeJs-Buffer
- Node.js- C++ Addons
- Node.js-C++ Addons Node-API
- NodeJs-C++ Embedder API
- Node.js-Child Process
- NodeJs-Cluster
- Node.js-命令行选项
- Node.js-Console
- Node.js-Corepack
- Node.js-Crypto
- NodeJs-Debugger
- NodeJs-Diagnostics Channel
- NodeJs-DNS
- NodeJs-Domain
- NodeJs-Errors
- NodeJs-Events
- NodeJs-File system(一)
- NodeJs-File system(二)
- NodeJs-File system(三)
- NodeJs-Globals
- NodeJs-HTTP
- NodeJs-HTTP/2
- NodeJs-HTTPS
- NodeJs-Inspector
- NodeJs-Internationalization
- NodeJs-Modules CommonJS modules、ECMAScript modules、node:module、Packages、TypeScript
- NodeJs-Net
- NodeJs-OS
- NodeJs-path
- NodeJs-Performance Hooks
- NodeJs-Permissions
- NodeJs-process
- NodeJs-punycode
- Node.js-querystring
- NodeJs-Readline
- NodeJs-REPL
- NodeJs-Report
- NodeJs-Single Executable Applications
- NodeJs-SQLite
- NodeJs-Stream
- NodeJs-String Decoder
- NodeJs-Test runner
- NodeJs-Timers
- NodeJs-TLS/SSL
- NodeJs-Trace events
- NodeJs-TTY
- NodeJs-UDP/datagram
- NodeJs-URL
- NodeJs-Utilities
- NodeJs-V8
- NodeJs-VM
- NodeJs-WASI
- NodeJs-Web Crypto API
- NodeJs Web Streams API
- NodeJs Worker threads
- NodeJs-Zlib
- NodeJs-Single Executable Applications
NodeJs-DNS
class DNSNode.js的DNS(域名系统)模块提供了域名解析的功能,使得Node.js应用程序可以将域名解析为IP地址。DNS模块内置于Node.js中,支持通过异步和同步方式进行域名解析。
1. 引入DNS模块
要使用Node.js的DNS模块,首先需要在你的JavaScript文件中引入它:
const dns = require('dns');
2. DNS模块方法及属性
DNS模块提供了一些常用的方法和属性,以下是详细的说明:
2.1 解析方法
这些方法用于将主机名解析为IP地址,或者将IP地址反向解析为主机名。
-
dns.lookup(hostname[, options], callback)
解析域名(例如 'nodejs.org')为IPv4或IPv6地址。
dns.lookup
使用操作系统底层的DNS解析器。- hostname: 字符串,待解析的域名。
- options: 对象或整数,可选参数。
family
(默认:0):如果指定为4
,则仅返回IPv4地址;如果为6
,则仅返回IPv6地址。all
(默认:false):如果为true
,则返回所有记录,而不仅是第一个匹配的记录。verbatim
(默认:false):是否按原样返回解析的IP地址。
- callback: 回调函数,格式为
(err, address, family)
。
示例:
dns.lookup('example.com', (err, address, family) => { console.log('IP 地址:', address); console.log('IP 地址族:', family); });
-
dns.resolve(hostname[, rrtype], callback)
使用DNS协议解析一个主机名。不同于
dns.lookup
,dns.resolve
会直接从DNS服务器获取结果,而不是依赖操作系统的解析器。- hostname: 字符串,要解析的域名。
- rrtype: 字符串,可选参数,表示要查询的资源记录类型(如
'A'
,'AAAA'
,'MX'
,'TXT'
等)。默认值为'A'
。 - callback: 回调函数,格式为
(err, records)
,records
取决于rrtype
的值。
示例:
dns.resolve('example.com', 'A', (err, addresses) => { if (err) throw err; console.log('IP 地址:', addresses); });
-
dns.resolve4(hostname, callback)
解析IPv4地址的快捷方法,相当于
dns.resolve(hostname, 'A', callback)
。示例:
dns.resolve4('example.com', (err, addresses) => { if (err) throw err; console.log('IPv4 地址:', addresses); });
-
dns.resolve6(hostname, callback)
解析IPv6地址的快捷方法,相当于
dns.resolve(hostname, 'AAAA', callback)
。示例:
dns.resolve6('example.com', (err, addresses) => { if (err) throw err; console.log('IPv6 地址:', addresses); });
-
dns.resolveMx(hostname, callback)
解析邮件交换记录(MX记录)。
- callback: 回调函数,格式为
(err, addresses)
,addresses
是一个对象数组,每个对象都有两个属性:priority
(数值)和exchange
(字符串)。
示例:
dns.resolveMx('example.com', (err, addresses) => { if (err) throw err; console.log('MX 记录:', addresses); });
- callback: 回调函数,格式为
-
dns.resolveTxt(hostname, callback)
解析文本记录(TXT记录)。
- callback: 回调函数,格式为
(err, records)
,records
是一个二维数组,其中每个子数组表示一条TXT记录。
示例:
dns.resolveTxt('example.com', (err, records) => { if (err) throw err; console.log('TXT 记录:', records); });
- callback: 回调函数,格式为
-
dns.resolveSrv(hostname, callback)
解析服务记录(SRV记录)。
- callback: 回调函数,格式为
(err, records)
,records
是一个对象数组,每个对象都有priority
、weight
、port
和name
属性。
示例:
dns.resolveSrv('_xmpp-server._tcp.example.com', (err, addresses) => { if (err) throw err; console.log('SRV 记录:', addresses); });
- callback: 回调函数,格式为
-
dns.resolveSoa(hostname, callback)
解析起始授权机构(SOA记录)。
- callback: 回调函数,格式为
(err, record)
,record
是一个包含SOA记录详细信息的对象。
示例:
dns.resolveSoa('example.com', (err, soa) => { if (err) throw err; console.log('SOA 记录:', soa); });
- callback: 回调函数,格式为
-
dns.resolveNs(hostname, callback)
解析名称服务器记录(NS记录)。
- callback: 回调函数,格式为
(err, addresses)
,addresses
是一个字符串数组,每个字符串代表一个名称服务器。
示例:
dns.resolveNs('example.com', (err, addresses) => { if (err) throw err; console.log('NS 记录:', addresses); });
- callback: 回调函数,格式为
-
dns.resolveCname(hostname, callback)
解析规范名称记录(CNAME记录)。
- callback: 回调函数,格式为
(err, addresses)
,addresses
是一个字符串数组,每个字符串代表一个CNAME。
示例:
dns.resolveCname('www.example.com', (err, addresses) => { if (err) throw err; console.log('CNAME 记录:', addresses); });
- callback: 回调函数,格式为
-
dns.reverse(ip, callback)
反向解析IP地址为域名。
- ip: 字符串,待解析的IP地址。
- callback: 回调函数,格式为
(err, hostnames)
,hostnames
是一个字符串数组,表示与该IP地址关联的域名。
示例:
dns.reverse('8.8.8.8', (err, hostnames) => { if (err) throw err; console.log('反向解析的主机名:', hostnames); });
2.2 同步方法
-
dns.lookupService(address, port, callback)
使用操作系统的DNS服务来解析地址,并确定与之关联的主机名和服务。
- address: 字符串,IP地址。
- port: 数字,端口号。
- callback: 回调函数,格式为
(err, hostname, service)
。
示例:
dns.lookupService('127.0.0.1', 22, (err, hostname, service) => { console.log('主机名:', hostname); console.log('服务:', service); });
-
dns.setServers(servers)
设置DNS服务器地址的字符串数组。格式为
[ '4.4.4.4', '8.8.8.8' ]
。这些地址将用于所有DNS解析请求。- servers: 字符串数组,新的DNS服务器地址。
示例:
dns.setServers(['8.8.8.8', '8.8.4.4']);
-
dns.getServers()
获取当前设置的DNS服务器地址。
示例:
console.log(dns.getServers());
3. DNS 解析器类 dns.Resolver
dns.Resolver
类提供了一个独立的DNS解析器实例,可以用于创建和管理特定的DNS解析会话。
3.1 创建 dns.Resolver
实例
const resolver = new dns.Resolver();
3.2 dns.Resolver
方法
-
resolver.setServers(servers)
设置DNS服务器地址的字符串数组。这些地址将仅用于此解析器实例的DNS解析请求。
- servers: 字符串数组,新的DNS服务器地址。
示例:
resolver.setServers(['1.1.1.1']);
-
resolver.getServers()
返回该解析器实例使用的当前DNS服务器地址数组。
示例:
console.log(resolver.getServers());
-
resolver.resolve(hostname[, rrtype, callback])
此方法与
dns.resolve
相似,只是它是dns.Resolver
实例的方法。示例:
resolver.resolve(' example.com', 'A', (err, addresses) => { if (err) throw err; console.log('IP 地址:', addresses); });
dns.Resolver
类还提供了其他与dns
模块类似的方法,如resolve4()
、resolve6()
等。
4. 错误处理
所有的DNS解析方法都可能抛出错误,这些错误是Error
对象的实例。错误对象的code
属性表示具体的错误类型,常见的DNS错误类型包括:
dns.NODATA
:请求的DNS记录类型没有数据。dns.FORMERR
:DNS查询格式错误。dns.SERVFAIL
:DNS服务器无法处理请求。dns.NOTFOUND
:域名未找到。dns.NOTIMP
:请求的操作不被支持。dns.REFUSED
:DNS服务器拒绝回答查询。dns.BADQUERY
:查询字符串无效。dns.BADNAME
:域名无效。dns.BADFAMILY
:地址族无效。dns.BADRESP
:DNS服务器返回的响应无效。dns.CONNREFUSED
:无法连接DNS服务器。dns.TIMEOUT
:请求超时。dns.EOF
:网络读取结束。dns.FILE
:文件错误。dns.NOMEM
:内存不足。dns.DESTRUCTION
:通道被破坏。dns.BADSTR
:DNS字符串解析错误。dns.BADFLAGS
:无效的标志。dns.NONAME
:未设置域名。dns.BADHINTS
:无效的DNS提示。
这些错误类型有助于开发者在解析过程中进行错误处理。
5. 小结
Node.js的DNS模块提供了强大的域名解析功能,无论是简单的IP地址查询,还是复杂的邮件交换、服务发现等都可以实现。通过合理利用DNS模块,开发者可以为Node.js应用程序提供高效的网络连接能力。同时,dns.Resolver
类提供了更灵活的方式来管理DNS解析,使开发者可以根据需要设置特定的DNS服务器和解析策略。