Nodejs Dns Module
[Node.js Built-in Module](#)
* * *
The `dns` module is a core module for Domain Name System (DNS) lookup. DNS (Domain Name System) is the system that translates human-readable domain names (like `www.example.com`) into machine-readable IP addresses (like `192.0.2.1`).
### Why do we need the dns module
In network communication, computers actually identify each other through IP addresses, but people find it easier to remember domain names rather than numeric IP addresses. The `dns` module provides the ability to perform domain name resolution in Node.js applications, enabling developers to:
* Resolve domain names to IP addresses
* Reverse resolve IP addresses to domain names
* Query DNS records (MX, TXT, SRV, etc.)
* * *
## Basic usage of dns module
### Importing the dns module
To use the `dns` module, you first need to import it:
const dns = require('dns');
### Basic resolution methods
The `dns` module provides multiple resolution methods, the most commonly used are `lookup` and `resolve`.
#### dns.lookup()
`dns.lookup()` is the simplest domain name resolution method, it uses the operating system's functionality to perform DNS queries:
## Example
dns.lookup('example.com',(err, address, family)=>{
if(err)throw err;
console.log(`Address.: ${address}, IPVersion: IPv${family}`);
});
#### dns.resolve()
`dns.resolve()` provides more granular control and can query specific types of DNS records:
## Example
dns.resolve('example.com','A',(err, addresses)=>{
if(err)throw err;
console.log(`ARecord: ${JSON.stringify(addresses)}`);
});
* * *
## Main methods of dns module
### Forward resolution
Forward resolution is the process of resolving domain names to IP addresses:
## Example
dns.resolve4('google.com',(err, addresses)=>{
if(err)throw err;
console.log(`IPv4Address.: ${addresses}`);
});
dns.resolve6('google.com',(err, addresses)=>{
if(err)throw err;
console.log(`IPv6Address.: ${addresses}`);
});
### Reverse resolution
Reverse resolution is the process of resolving IP addresses to domain names:
## Example
dns.reverse('8.8.8.8',(err, hostnames)=>{
if(err)throw err;
console.log(`Reverse lookup Result: ${hostnames}`);
});
### Other DNS record queries
The `dns` module also supports querying other types of DNS records:
## Example
// MXRecord(MX Record)
dns.resolveMx('google.com',(err, addresses)=>{
if(err)throw err;
console.log(`MXRecord: ${JSON.stringify(addresses)}`);
});
// TXTRecord(TXT Record)
dns.resolveTxt('google.com',(err, records)=>{
if(err)throw err;
console.log(`TXTRecord: ${JSON.stringify(records)}`);
});
* * *
## Synchronous and Asynchronous methods
### Asynchronous methods
By default, the methods in the `dns` module are asynchronous and use callback functions to handle results:
## Example
dns.lookup('nodejs.org',(err, address, family)=>{
console.log('Async Result:', address);
});
### Promise version
Starting from Node.js v10.6.0, the `dns` module methods also provide Promise-based versions:
## Example
const{ promises: dnsPromises }= require('dns');
async function lookupExample(){
try{
const result = await dnsPromises.lookup('nodejs.org');
console.log('PromiseResult:', result.address);
}catch(err){
console.error(err);
}
}
lookupExample();
* * *
## Error handling
DNS queries may fail, so proper error handling is important:
## Example
dns.lookup('nonexistent.example.com',(err, address)=>{
if(err){
if(err.code==='ENOTFOUND'){
console.log('Domain not found');
}else{
console.log('Unknown error:', err);
}
return;
}
console.log('Address.:', address);
});
Common DNS error codes include:
* `ENOTFOUND`: Domain name does not exist
* `ESERVFAIL`: DNS server returned a failure
* `ETIMEOUT`: DNS query timed out
* * *
## Practical application examples
### Check if a domain is resolvable
## Example
function isDomainResolvable(domain){
return new Promise((resolve)=>{
dns.lookup(domain,(err)=>{
resolve(!err);
});
});
}
isDomainResolvable('google.com').then(result =>{
console.log('Domain resolvable:', result);
});
### Batch resolve domain names
## Example
const domains =['google.com','facebook.com','twitter.com'];
Promise.all(domains.map(domain => dnsPromises.lookup(domain)))
.then(results =>{
results.forEach((result, index)=>{
console.log(`${domains}=> ${result.address}`);
});
})
.catch(err =>{
console.error('Resolution failed:', err);
});
* * *
## Performance considerations
DNS queries are I/O operations and may affect application performance:
1. **Cache results**: For frequently queried domain names, consider caching results at the application layer
2. **Limit concurrency**: Avoid initiating a large number of DNS queries simultaneously
3. **Set timeouts**: Set reasonable timeout values for DNS queries
## Example
const cache =new Map();
async function cachedLookup(domain){
if(cache.has(domain)){
return cache.get(domain);
}
const result = await dnsPromises.lookup(domain);
cache.set(domain, result);
return result;
}
* * *
* * *
## Methods
| Method | Description | Example |
| --- | --- | --- |
| `dns.lookup(hostname[, options], callback)` | Resolves a hostname into the first found IPv4 or IPv6 address. Optional `options` parameter can specify resolution method, such as `family` (4 or 6). | `dns.lookup('example.com', (err, address) => {});` |
| `dns.resolve(hostname[, rrtype], callback)` | Queries DNS records of the specified type, returns A records by default. Supported types include A, AAAA, MX, TXT, etc. | `dns.resolve('example.com', 'MX', (err, addresses
YouTip