DNS в Node.js — модуль dns
Резолв доменов в IP. Два API: blocking
dns.lookupчерез libuv threadpool и асинхронныйdns.resolve*через C-ares.
Что это
DNS (Domain Name System) — телефонная книга интернета. Превращает github.com → 140.82.121.4. Нода даёт два разных API:
dns.lookup(hostname, cb)— использует системный резолвер (через libuv threadpool); блокирует поток пула, кэшируется ОС.dns.resolve*— асинхронный через C-ares; идёт прямо к DNS-серверу, не использует hosts/nsswitch.
API / Пример
const dns = require('dns');
// lookup — системный (учитывает /etc/hosts)
dns.lookup('github.com', { family: 4 }, (err, address) => {
console.log(address); // '140.82.121.4'
});
// resolve — прямой DNS-запрос
dns.resolve4('github.com', (err, addresses) => {
console.log(addresses); // ['140.82.121.4']
});
// resolveAny — все типы записей
dns.resolveAny('github.com', (err, records) => {
console.log(records); // [{type:'A',...}, {type:'MX',...}, {type:'TXT',...}]
});
// Promise-API
const { Resolver } = require('dns').promises;
const resolver = new Resolver();
resolver.setServers(['8.8.8.8', '1.1.1.1']);
const ips = await resolver.resolve('example.com');
Типы DNS-записей
- A — IPv4
- AAAA — IPv6
- MX — почтовые серверы
- NS — name servers
- TXT — текстовые (SPF, DKIM)
- CNAME — алиас
- PTR — обратный резолв (IP → host)
Производительность / Подводные камни
lookupблокирует threadpool (4 потока по умолчанию). При большом числе DNS-запросов либо увеличитьUV_THREADPOOL_SIZE, либо использоватьresolve*.resolve*не использует /etc/hosts — для тестов с локальным DNS нуженlookup.getServersсинхронный — возвращает список текущих DNS-резолверов.setServers— переопределить (например, Google8.8.8.8или Cloudflare1.1.1.1).- DNS-кэширование в HTTP-клиентах — нода не кэширует резолв сама, каждый
http.requestделает новый lookup. Для high-load — agent с keep-alive или пакетcacheable-lookup.
🎓 Источники
- 🎓 Клиент-сервер на Node.js TCP и UDP, DNS · 2018-10-03
- Тезисы:
dns.lookupдля информации о хосте;dns.resolveотдаёт массив IP;resolveAny— все типы записей сразу;getServersсинхронный,setServersдля смены;family: 6для IPv6.
- Тезисы: