DNS в Node.js — модуль dns

Резолв доменов в IP. Два API: blocking dns.lookup через libuv threadpool и асинхронный dns.resolve* через C-ares.

Что это

DNS (Domain Name System) — телефонная книга интернета. Превращает github.com140.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 — переопределить (например, Google 8.8.8.8 или Cloudflare 1.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.

См. также