dns
The dns module provides name resolution functionality, allowing you to resolve domain names to IP addresses and vice versa.
Import
const dns = require('dns');
// For promise-based API
const dnsPromises = require('dns').promises;
API Reference
dns.lookup(hostname[, options], callback)
Resolves a hostname to the first found A (IPv4) or AAAA (IPv6) record.
Parameters:
hostname- Hostname to resolveoptions- Can be an object or integer (address family)family- Address family (4 or 6)all- Return all resolved addresses (default: false)
callback(err, address, family)- Callback function
dns.resolve4(hostname[, options], callback)
Resolves a hostname to an array of IPv4 addresses.
dns.resolve6(hostname[, options], callback)
Resolves a hostname to an array of IPv6 addresses.
dns.resolve(hostname[, rrtype], callback)
Resolves a hostname using the specified DNS record type.
Record types: 'A', 'AAAA', 'CNAME', 'MX', 'NS', 'PTR', 'SOA', 'SRV', 'TXT'
dns.resolveMx(hostname, callback)
Resolves a hostname to an array of MX (mail exchange) records.
dns.resolveTxt(hostname, callback)
Resolves a hostname to an array of TXT records.
dns.resolveCname(hostname, callback)
Resolves a hostname to an array of CNAME records.
dns.resolveNs(hostname, callback)
Resolves a hostname to an array of name server records.
dns.resolveSrv(hostname, callback)
Resolves a hostname to an array of SRV records.
dns.reverse(ip, callback)
Performs a reverse DNS query that resolves an IP address to an array of hostnames.
dns.promises API
All methods have promise-based equivalents in dns.promises.
Examples
Basic Hostname Resolution
const dns = require('dns').promises;
export async function handler(event) {
const hostname = event.hostname || 'example.com';
try {
// Resolve to IP address
const address = await dns.lookup(hostname);
console.log('Resolved:', address);
return {
hostname,
address: address.address,
family: address.family
};
} catch (error) {
console.error('DNS lookup failed:', error);
throw error;
}
}
Resolving All Addresses
const dns = require('dns').promises;
export async function handler(event) {
const hostname = event.hostname || 'google.com';
// Get all addresses
const addresses = await dns.lookup(hostname, { all: true });
return {
hostname,
addressCount: addresses.length,
addresses: addresses.map(a => ({
address: a.address,
family: a.family === 4 ? 'IPv4' : 'IPv6'
}))
};
}
IPv4 and IPv6 Resolution
const dns = require('dns').promises;
export async function handler(event) {
const hostname = event.hostname || 'example.com';
try {
// Resolve IPv4 addresses
const ipv4Addresses = await dns.resolve4(hostname);
// Resolve IPv6 addresses
let ipv6Addresses = [];
try {
ipv6Addresses = await dns.resolve6(hostname);
} catch (err) {
console.log('No IPv6 addresses found');
}
return {
hostname,
ipv4: ipv4Addresses,
ipv6: ipv6Addresses
};
} catch (error) {
console.error('DNS resolution failed:', error);
throw error;
}
}
MX Record Lookup
const dns = require('dns').promises;
export async function handler(event) {
const domain = event.domain || 'gmail.com';
try {
// Get mail server records
const mxRecords = await dns.resolveMx(domain);
// Sort by priority (lower is higher priority)
mxRecords.sort((a, b) => a.priority - b.priority);
return {
domain,
mailServers: mxRecords.map(record => ({
priority: record.priority,
exchange: record.exchange
}))
};
} catch (error) {
console.error('MX lookup failed:', error);
throw error;
}
}
TXT Record Lookup
const dns = require('dns').promises;
export async function handler(event) {
const domain = event.domain || 'example.com';
try {
// Get TXT records (e.g., SPF, DKIM, domain verification)
const txtRecords = await dns.resolveTxt(domain);
// Flatten records (each can be an array of strings)
const records = txtRecords.map(record => record.join(''));
return {
domain,
txtRecords: records
};
} catch (error) {
console.error('TXT lookup failed:', error);
throw error;
}
}
Reverse DNS Lookup
const dns = require('dns').promises;
export async function handler(event) {
const ipAddress = event.ip || '8.8.8.8';
try {
// Reverse lookup - IP to hostname
const hostnames = await dns.reverse(ipAddress);
return {
ip: ipAddress,
hostnames
};
} catch (error) {
console.error('Reverse DNS failed:', error);
return {
ip: ipAddress,
hostnames: [],
error: error.message
};
}
}
CNAME Record Resolution
const dns = require('dns').promises;
export async function handler(event) {
const hostname = event.hostname || 'www.example.com';
try {
// Resolve CNAME records
const cnames = await dns.resolveCname(hostname);
return {
hostname,
cnames
};
} catch (error) {
if (error.code === 'ENODATA') {
return {
hostname,
message: 'No CNAME records found'
};
}
throw error;
}
}
Name Server Lookup
const dns = require('dns').promises;
export async function handler(event) {
const domain = event.domain || 'example.com';
try {
// Get name servers for domain
const nameservers = await dns.resolveNs(domain);
return {
domain,
nameservers
};
} catch (error) {
console.error('NS lookup failed:', error);
throw error;
}
}
SRV Record Lookup
const dns = require('dns').promises;
export async function handler(event) {
// Example: _service._proto.domain
const service = event.service || '_xmpp-server._tcp.gmail.com';
try {
const srvRecords = await dns.resolveSrv(service);
return {
service,
records: srvRecords.map(record => ({
priority: record.priority,
weight: record.weight,
port: record.port,
name: record.name
}))
};
} catch (error) {
console.error('SRV lookup failed:', error);
throw error;
}
}
Comprehensive DNS Information
const dns = require('dns').promises;
export async function handler(event) {
const domain = event.domain || 'example.com';
const results = {
domain,
timestamp: new Date().toISOString()
};
// A records (IPv4)
try {
results.ipv4 = await dns.resolve4(domain);
} catch (err) {
results.ipv4 = [];
}
// AAAA records (IPv6)
try {
results.ipv6 = await dns.resolve6(domain);
} catch (err) {
results.ipv6 = [];
}
// MX records
try {
results.mx = await dns.resolveMx(domain);
} catch (err) {
results.mx = [];
}
// TXT records
try {
const txt = await dns.resolveTxt(domain);
results.txt = txt.map(record => record.join(''));
} catch (err) {
results.txt = [];
}
// NS records
try {
results.nameservers = await dns.resolveNs(domain);
} catch (err) {
results.nameservers = [];
}
// CNAME records
try {
results.cname = await dns.resolveCname(domain);
} catch (err) {
results.cname = [];
}
return results;
}
Callback-based API Example
const dns = require('dns');
export async function handler(event) {
const hostname = event.hostname || 'example.com';
// Using callback-based API
return new Promise((resolve, reject) => {
dns.lookup(hostname, (err, address, family) => {
if (err) {
reject(err);
} else {
resolve({
hostname,
address,
family
});
}
});
});
}
DNS Error Handling
const dns = require('dns').promises;
export async function handler(event) {
const hostname = event.hostname;
if (!hostname) {
return { error: 'hostname is required' };
}
try {
const address = await dns.lookup(hostname);
return {
success: true,
hostname,
address: address.address
};
} catch (error) {
// Handle common DNS errors
const errorMap = {
'ENOTFOUND': 'Domain not found',
'ENODATA': 'No data returned',
'ETIMEOUT': 'DNS query timed out',
'ECONNREFUSED': 'Connection refused',
'ESERVFAIL': 'Server failed to complete query'
};
return {
success: false,
hostname,
error: errorMap[error.code] || error.message,
code: error.code
};
}
}
Common Error Codes
ENOTFOUND- Domain name not foundENODATA- DNS server returned answer with no dataETIMEOUT- DNS query timed outECONNREFUSED- Connection to DNS server refusedESERVFAIL- DNS server returned a failure
Best Practices
- Use the promise-based API (
dns.promises) for cleaner async code - Handle common DNS errors gracefully
- Consider caching DNS results for frequently accessed domains
- Use appropriate record types for your use case
- Be aware that DNS lookups can fail due to network issues