Skip to content

DNS

[Stable: 2 - Stable]

Stable: 2 Стабильность: 2 - Стабильный

Исходный код: lib/dns.js

Модуль node:dns позволяет разрешать имена. Например, используйте его для поиска IP-адресов имен хостов.

Хотя он и назван в честь Системы доменных имен (DNS), он не всегда использует протокол DNS для поиска. dns.lookup() использует средства операционной системы для выполнения разрешения имен. Возможно, ему не потребуется выполнять никаких сетевых коммуникаций. Чтобы выполнить разрешение имен так же, как это делают другие приложения в той же системе, используйте dns.lookup().

js
import dns from 'node:dns'

dns.lookup('example.org', (err, address, family) => {
  console.log('address: %j family: IPv%s', address, family)
})
// address: "2606:2800:21f:cb07:6820:80da:af6b:8b2c" family: IPv6
js
const dns = require('node:dns')

dns.lookup('example.org', (err, address, family) => {
  console.log('address: %j family: IPv%s', address, family)
})
// address: "2606:2800:21f:cb07:6820:80da:af6b:8b2c" family: IPv6

Все остальные функции в модуле node:dns подключаются к реальному DNS-серверу для выполнения разрешения имен. Они всегда будут использовать сеть для выполнения DNS-запросов. Эти функции не используют тот же набор файлов конфигурации, что и dns.lookup() (например, /etc/hosts). Используйте эти функции, чтобы всегда выполнять DNS-запросы, минуя другие средства разрешения имен.

js
import dns from 'node:dns'

dns.resolve4('archive.org', (err, addresses) => {
  if (err) throw err

  console.log(`addresses: ${JSON.stringify(addresses)}`)

  addresses.forEach(a => {
    dns.reverse(a, (err, hostnames) => {
      if (err) {
        throw err
      }
      console.log(`reverse for ${a}: ${JSON.stringify(hostnames)}`)
    })
  })
})
js
const dns = require('node:dns')

dns.resolve4('archive.org', (err, addresses) => {
  if (err) throw err

  console.log(`addresses: ${JSON.stringify(addresses)}`)

  addresses.forEach(a => {
    dns.reverse(a, (err, hostnames) => {
      if (err) {
        throw err
      }
      console.log(`reverse for ${a}: ${JSON.stringify(hostnames)}`)
    })
  })
})

См. раздел Соображения по реализации для получения дополнительной информации.

Класс: dns.Resolver

Добавлено в: v8.3.0

Независимый резольвер для DNS-запросов.

Создание нового резольвера использует настройки сервера по умолчанию. Установка серверов, используемых для резольвера, с помощью resolver.setServers() не влияет на другие резольверы:

js
import { Resolver } from 'node:dns'
const resolver = new Resolver()
resolver.setServers(['4.4.4.4'])

// Этот запрос будет использовать сервер 4.4.4.4, независимо от глобальных настроек.
resolver.resolve4('example.org', (err, addresses) => {
  // ...
})
js
const { Resolver } = require('node:dns')
const resolver = new Resolver()
resolver.setServers(['4.4.4.4'])

// Этот запрос будет использовать сервер 4.4.4.4, независимо от глобальных настроек.
resolver.resolve4('example.org', (err, addresses) => {
  // ...
})

Доступны следующие методы из модуля node:dns:

Resolver([options])

[История]

ВерсияИзменения
v16.7.0, v14.18.0Объект options теперь принимает опцию tries.
v12.18.3Конструктор теперь принимает объект options. Единственная поддерживаемая опция — timeout.
v8.3.0Добавлено в: v8.3.0

Создать новый резольвер.

  • options <Object>
    • timeout <integer> Тайм-аут запроса в миллисекундах или -1, чтобы использовать тайм-аут по умолчанию.
    • tries <integer> Количество попыток, которые резольвер будет пытаться связаться с каждым сервером имен, прежде чем сдаться. По умолчанию: 4

resolver.cancel()

Добавлено в версии: v8.3.0

Отменяет все ожидающие DNS-запросы, сделанные этим резолвером. Соответствующие обратные вызовы будут вызваны с ошибкой с кодом ECANCELLED.

resolver.setLocalAddress([ipv4][, ipv6])

Добавлено в версии: v15.1.0, v14.17.0

  • ipv4 <string> Строковое представление IPv4-адреса. По умолчанию: '0.0.0.0'
  • ipv6 <string> Строковое представление IPv6-адреса. По умолчанию: '::0'

Экземпляр резолвера будет отправлять свои запросы с указанного IP-адреса. Это позволяет программам указывать исходящие интерфейсы при использовании в многоинтерфейсных системах.

Если адрес v4 или v6 не указан, он устанавливается по умолчанию, и операционная система автоматически выберет локальный адрес.

Резолвер будет использовать локальный адрес v4 при выполнении запросов к DNS-серверам IPv4 и локальный адрес v6 при выполнении запросов к DNS-серверам IPv6. rrtype запросов на разрешение не влияет на используемый локальный адрес.

dns.getServers()

Добавлено в версии: v0.11.3

Возвращает массив строк IP-адресов, отформатированных в соответствии с RFC 5952, которые в настоящее время настроены для разрешения DNS. Строка будет включать раздел порта, если используется пользовательский порт.

js
;['8.8.8.8', '2001:4860:4860::8888', '8.8.8.8:1053', '[2001:4860:4860::8888]:1053']

dns.lookup(hostname[, options], callback)

[История]

ВерсияИзменения
v22.1.0, v20.13.0Опция verbatim теперь устарела в пользу новой опции order.
v18.4.0Для совместимости с node:net, при передаче объекта опций опция family может быть строкой 'IPv4' или строкой 'IPv6'.
v18.0.0Передача недействительного обратного вызова аргументу callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.
v17.0.0Параметр verbatim теперь по умолчанию имеет значение true.
v8.5.0Теперь поддерживается параметр verbatim.
v1.2.0Теперь поддерживается параметр all.
v0.1.90Добавлено в версии: v0.1.90
  • hostname <string>

  • options <integer> | <Object>

    • family <integer> | <string> Семейство записей. Должно быть 4, 6 или 0. По причинам обратной совместимости 'IPv4' и 'IPv6' интерпретируются как 4 и 6 соответственно. Значение 0 указывает, что возвращается либо IPv4-, либо IPv6-адрес. Если значение 0 используется с { all: true } (см. ниже), возвращается либо один из, либо оба IPv4- и IPv6-адреса, в зависимости от DNS-резолвера системы. По умолчанию: 0.
    • hints <number> Один или несколько поддерживаемых флагов getaddrinfo. Несколько флагов можно передать, используя побитовое OR их значения.
    • all <boolean> Если true, обратный вызов возвращает все разрешенные адреса в массиве. В противном случае возвращает один адрес. По умолчанию: false.
    • order <string> Если verbatim, разрешенные адреса возвращаются неотсортированными. Если ipv4first, разрешенные адреса сортируются путем размещения IPv4-адресов перед IPv6-адресами. Если ipv6first, разрешенные адреса сортируются путем размещения IPv6-адресов перед IPv4-адресами. По умолчанию: verbatim (адреса не переупорядочиваются). Значение по умолчанию настраивается с помощью dns.setDefaultResultOrder() или --dns-result-order.
    • verbatim <boolean> Если true, обратный вызов получает IPv4- и IPv6-адреса в том порядке, в котором их вернул DNS-резолвер. Если false, IPv4-адреса помещаются перед IPv6-адресами. Эта опция будет устаревшей в пользу order. Если указаны оба параметра, order имеет более высокий приоритет. Новый код должен использовать только order. По умолчанию: true (адреса не переупорядочиваются). Значение по умолчанию настраивается с помощью dns.setDefaultResultOrder() или --dns-result-order.
  • callback <Function>

    • err <Error>
    • address <string> Строковое представление IPv4- или IPv6-адреса.
    • family <integer> 4 или 6, обозначающие семейство address, или 0, если адрес не является адресом IPv4 или IPv6. 0 является вероятным индикатором ошибки в службе разрешения имен, используемой операционной системой.

Разрешает имя хоста (например, 'nodejs.org') в первую найденную запись A (IPv4) или AAAA (IPv6). Все свойства option являются необязательными. Если options является целым числом, то оно должно быть 4 или 6 – если options не указано, то возвращаются либо IPv4, либо IPv6-адреса, либо оба, если они найдены.

Если для параметра all установлено значение true, аргументы для callback изменяются на (err, addresses), где addresses является массивом объектов со свойствами address и family.

В случае ошибки err является объектом Error, где err.code является кодом ошибки. Имейте в виду, что err.code будет установлен в 'ENOTFOUND' не только тогда, когда имя хоста не существует, но и когда поиск не удается другими способами, например, при отсутствии доступных файловых дескрипторов.

dns.lookup() не обязательно имеет какое-либо отношение к протоколу DNS. Реализация использует средство операционной системы, которое может связывать имена с адресами и наоборот. Эта реализация может иметь тонкие, но важные последствия для поведения любой программы Node.js. Пожалуйста, уделите некоторое время изучению раздела Соображения по реализации перед использованием dns.lookup().

Пример использования:

js
import dns from 'node:dns'
const options = {
  family: 6,
  hints: dns.ADDRCONFIG | dns.V4MAPPED,
}
dns.lookup('example.org', options, (err, address, family) => console.log('address: %j family: IPv%s', address, family))
// address: "2606:2800:21f:cb07:6820:80da:af6b:8b2c" family: IPv6

// Когда options.all имеет значение true, результатом будет Array.
options.all = true
dns.lookup('example.org', options, (err, addresses) => console.log('addresses: %j', addresses))
// addresses: [{"address":"2606:2800:21f:cb07:6820:80da:af6b:8b2c","family":6}]
js
const dns = require('node:dns')
const options = {
  family: 6,
  hints: dns.ADDRCONFIG | dns.V4MAPPED,
}
dns.lookup('example.org', options, (err, address, family) => console.log('address: %j family: IPv%s', address, family))
// address: "2606:2800:21f:cb07:6820:80da:af6b:8b2c" family: IPv6

// Когда options.all имеет значение true, результатом будет Array.
options.all = true
dns.lookup('example.org', options, (err, addresses) => console.log('addresses: %j', addresses))
// addresses: [{"address":"2606:2800:21f:cb07:6820:80da:af6b:8b2c","family":6}]

Если этот метод вызывается как его версия, созданная с помощью util.promisify(), и all не установлено в значение true, он возвращает Promise для Object со свойствами address и family.

Поддерживаемые флаги getaddrinfo

[История]

ВерсияИзменения
v13.13.0, v12.17.0Добавлена поддержка флага dns.ALL.

Следующие флаги могут быть переданы в качестве подсказок в dns.lookup().

  • dns.ADDRCONFIG: Ограничивает типы возвращаемых адресов типами не-loopback адресов, настроенных в системе. Например, IPv4 адреса возвращаются только в том случае, если в текущей системе настроен хотя бы один IPv4 адрес.
  • dns.V4MAPPED: Если было указано семейство IPv6, но адреса IPv6 не были найдены, то возвращаются IPv4-отображенные IPv6 адреса. Не поддерживается в некоторых операционных системах (например, FreeBSD 10.1).
  • dns.ALL: Если указан dns.V4MAPPED, возвращает как разрешенные адреса IPv6, так и IPv4-отображенные адреса IPv6.

dns.lookupService(address, port, callback)

[История]

ВерсияИзменения
v18.0.0Передача недействительного обратного вызова в аргумент callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.
v0.11.14Добавлено в: v0.11.14

Преобразует заданные address и port в имя хоста и службу, используя базовую реализацию getnameinfo операционной системы.

Если address не является действительным IP-адресом, будет выброшено исключение TypeError. port будет приведен к числу. Если это не допустимый порт, будет выброшено исключение TypeError.

В случае ошибки, err - это объект Error, где err.code является кодом ошибки.

js
import dns from 'node:dns'
dns.lookupService('127.0.0.1', 22, (err, hostname, service) => {
  console.log(hostname, service)
  // Выводит: localhost ssh
})
js
const dns = require('node:dns')
dns.lookupService('127.0.0.1', 22, (err, hostname, service) => {
  console.log(hostname, service)
  // Выводит: localhost ssh
})

Если этот метод вызывается как его util.promisify() версия, он возвращает Promise для Object со свойствами hostname и service.

dns.resolve(hostname[, rrtype], callback)

[История]

ВерсияИзменения
v18.0.0Передача недействительного обратного вызова в аргумент callback теперь вызывает ошибку ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.
v0.1.27Добавлено в: v0.1.27

Использует протокол DNS для разрешения имени хоста (например, 'nodejs.org') в массив ресурсных записей. Функция callback имеет аргументы (err, records). При успехе records будет массивом ресурсных записей. Тип и структура отдельных результатов зависят от rrtype:

rrtyperecords содержитТип результатаСокращенный метод
'A'IPv4-адреса (по умолчанию)<string>dns.resolve4()
'AAAA'IPv6-адреса<string>dns.resolve6()
'ANY'любые записи<Object>dns.resolveAny()
'CAA'записи авторизации ЦС<Object>dns.resolveCaa()
'CNAME'записи канонических имен<string>dns.resolveCname()
'MX'записи почтового обмена<Object>dns.resolveMx()
'NAPTR'записи указателя полномочий имени<Object>dns.resolveNaptr()
'NS'записи сервера имен<string>dns.resolveNs()
'PTR'записи указателя<string>dns.resolvePtr()
'SOA'записи начала зоны полномочий<Object>dns.resolveSoa()
'SRV'записи служб<Object>dns.resolveSrv()
'TXT'текстовые записи<string[]>dns.resolveTxt()

В случае ошибки err является объектом Error, где err.code является одним из кодов ошибок DNS.

dns.resolve4(hostname[, options], callback)

[История]

ВерсияИзменения
v18.0.0Передача недопустимого обратного вызова в аргумент callback теперь выдает ошибку ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.
v7.2.0Этот метод теперь поддерживает передачу options, в частности options.ttl.
v0.1.16Добавлено в: v0.1.16
  • hostname <string> Имя хоста для разрешения.

  • options <Object>

    • ttl <boolean> Извлекает значение Time-To-Live (TTL) каждой записи. Если true, обратный вызов получает массив объектов { address: '1.2.3.4', ttl: 60 }, а не массив строк, с TTL, выраженным в секундах.
  • callback <Function>

Использует протокол DNS для разрешения IPv4-адресов (записи A) для hostname. Аргумент addresses, передаваемый в функцию callback, будет содержать массив IPv4-адресов (например, ['74.125.79.104', '74.125.79.105', '74.125.79.106']).

dns.resolve6(hostname[, options], callback)

[История]

ВерсияИзменения
v18.0.0Передача недопустимого обратного вызова в аргумент callback теперь выдает ошибку ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.
v7.2.0Этот метод теперь поддерживает передачу options, в частности options.ttl.
v0.1.16Добавлено в: v0.1.16
  • hostname <string> Имя хоста для разрешения.

  • options <Object>

    • ttl <boolean> Извлекает значение Time-To-Live (TTL) каждой записи. Если true, обратный вызов получает массив объектов { address: '0:1:2:3:4:5:6:7', ttl: 60 }, а не массив строк, с TTL, выраженным в секундах.
  • callback <Function>

Использует протокол DNS для разрешения IPv6-адресов (записи AAAA) для hostname. Аргумент addresses, передаваемый в функцию callback, будет содержать массив IPv6-адресов.

dns.resolveAny(hostname, callback)

[История]

ВерсияИзменения
v18.0.0Передача недопустимого обратного вызова в аргумент callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.

Использует протокол DNS для разрешения всех записей (также известных как запрос ANY или *). Аргумент ret, переданный функции callback, будет массивом, содержащим различные типы записей. Каждый объект имеет свойство type, которое указывает тип текущей записи. И в зависимости от type в объекте будут присутствовать дополнительные свойства:

ТипСвойства
'A'address / ttl
'AAAA'address / ttl
'CNAME'value
'MX'См. dns.resolveMx()
'NAPTR'См. dns.resolveNaptr()
'NS'value
'PTR'value
'SOA'См. dns.resolveSoa()
'SRV'См. dns.resolveSrv()
'TXT'Этот тип записи содержит свойство массива под названием entries, которое ссылается на dns.resolveTxt(), например, { entries: ['...'], type: 'TXT' }

Вот пример объекта ret, переданного обратному вызову:

js
;[
  { type: 'A', address: '127.0.0.1', ttl: 299 },
  { type: 'CNAME', value: 'example.com' },
  { type: 'MX', exchange: 'alt4.aspmx.l.example.com', priority: 50 },
  { type: 'NS', value: 'ns1.example.com' },
  { type: 'TXT', entries: ['v=spf1 include:_spf.example.com ~all'] },
  {
    type: 'SOA',
    nsname: 'ns1.example.com',
    hostmaster: 'admin.example.com',
    serial: 156696742,
    refresh: 900,
    retry: 900,
    expire: 1800,
    minttl: 60,
  },
]

Операторы DNS-серверов могут не отвечать на запросы ANY. Может быть лучше вызывать отдельные методы, такие как dns.resolve4(), dns.resolveMx() и так далее. Подробнее см. RFC 8482.

dns.resolveCname(hostname, callback)

[История]

ВерсияИзменения
v18.0.0Передача недействительного обратного вызова в аргумент callback теперь вызывает ошибку ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.
v0.3.2Добавлено в: v0.3.2

Использует протокол DNS для разрешения записей CNAME для hostname. Аргумент addresses, переданный в функцию callback, будет содержать массив записей канонических имен, доступных для hostname (например, ['bar.example.com']).

dns.resolveCaa(hostname, callback)

[История]

ВерсияИзменения
v18.0.0Передача недействительного обратного вызова в аргумент callback теперь вызывает ошибку ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.
v15.0.0, v14.17.0Добавлено в: v15.0.0, v14.17.0

Использует протокол DNS для разрешения записей CAA для hostname. Аргумент addresses, переданный в функцию callback, будет содержать массив записей авторизации центра сертификации, доступных для hostname (например, [{critical: 0, iodef: 'mailto:[email protected]'}, {critical: 128, issue: 'pki.example.com'}]).

dns.resolveMx(hostname, callback)

[История]

ВерсияИзменения
v18.0.0Передача недействительного обратного вызова в аргумент callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.
v0.1.27Добавлено в: v0.1.27

Использует протокол DNS для разрешения записей обмена почтой (MX записей) для hostname. Аргумент addresses, переданный в функцию callback, будет содержать массив объектов, содержащих как свойство priority, так и exchange (например, [{priority: 10, exchange: 'mx.example.com'}, ...]).

dns.resolveNaptr(hostname, callback)

[История]

ВерсияИзменения
v18.0.0Передача недействительного обратного вызова в аргумент callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.
v0.9.12Добавлено в: v0.9.12

Использует протокол DNS для разрешения записей на основе регулярных выражений (NAPTR записей) для hostname. Аргумент addresses, переданный в функцию callback, будет содержать массив объектов со следующими свойствами:

  • flags
  • service
  • regexp
  • replacement
  • order
  • preference
js
{
  flags: 's',
  service: 'SIP+D2U',
  regexp: '',
  replacement: '_sip._udp.example.com',
  order: 30,
  preference: 100
}

dns.resolveNs(hostname, callback)

[История]

ВерсияИзменения
v18.0.0Передача неверного обратного вызова в аргумент callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.
v0.1.90Добавлено в: v0.1.90

Использует протокол DNS для разрешения записей сервера имен (записей NS) для hostname. Аргумент addresses, передаваемый в функцию callback, будет содержать массив записей сервера имен, доступных для hostname (например, ['ns1.example.com', 'ns2.example.com']).

dns.resolvePtr(hostname, callback)

[История]

ВерсияИзменения
v18.0.0Передача неверного обратного вызова в аргумент callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.
v6.0.0Добавлено в: v6.0.0

Использует протокол DNS для разрешения указательных записей (записей PTR) для hostname. Аргумент addresses, передаваемый в функцию callback, будет массивом строк, содержащих записи ответа.

dns.resolveSoa(hostname, callback)

[История]

ВерсияИзменения
v18.0.0Передача неверного обратного вызова в аргумент callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.
v0.11.10Добавлено в: v0.11.10

Использует протокол DNS для разрешения записи начала зоны полномочий (записи SOA) для hostname. Аргумент address, передаваемый в функцию callback, будет объектом со следующими свойствами:

  • nsname
  • hostmaster
  • serial
  • refresh
  • retry
  • expire
  • minttl
js
{
  nsname: 'ns.example.com',
  hostmaster: 'root.example.com',
  serial: 2013101809,
  refresh: 10000,
  retry: 2400,
  expire: 604800,
  minttl: 3600
}

dns.resolveSrv(hostname, callback)

[История]

ВерсияИзменения
v18.0.0Передача недействительного обратного вызова аргументу callback теперь вызывает ошибку ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.
v0.1.27Добавлено в: v0.1.27

Использует протокол DNS для разрешения сервисных записей (записей SRV) для hostname. Аргумент addresses, передаваемый в функцию callback, будет массивом объектов со следующими свойствами:

  • priority
  • weight
  • port
  • name
js
{
  priority: 10,
  weight: 5,
  port: 21223,
  name: 'service.example.com'
}

dns.resolveTxt(hostname, callback)

[История]

ВерсияИзменения
v18.0.0Передача недействительного обратного вызова аргументу callback теперь вызывает ошибку ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.
v0.1.27Добавлено в: v0.1.27

Использует протокол DNS для разрешения текстовых запросов (записей TXT) для hostname. Аргумент records, передаваемый в функцию callback, представляет собой двумерный массив текстовых записей, доступных для hostname (например, [ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]). Каждый подмассив содержит фрагменты TXT одной записи. В зависимости от варианта использования их можно либо объединить вместе, либо рассматривать отдельно.

dns.reverse(ip, callback)

Добавлено в: v0.1.16

Выполняет обратный DNS-запрос, который преобразует IPv4 или IPv6-адрес в массив имен хостов.

В случае ошибки, err является объектом Error, где err.code является одним из кодов ошибок DNS.

dns.setDefaultResultOrder(order)

[История]

ВерсияИзменения
v22.1.0, v20.13.0Теперь поддерживается значение ipv6first.
v17.0.0Изменено значение по умолчанию на verbatim.
v16.4.0, v14.18.0Добавлено в: v16.4.0, v14.18.0
  • order <string> должен быть 'ipv4first', 'ipv6first' или 'verbatim'.

Устанавливает значение по умолчанию для order в dns.lookup() и dnsPromises.lookup(). Значение может быть:

  • ipv4first: устанавливает order по умолчанию в ipv4first.
  • ipv6first: устанавливает order по умолчанию в ipv6first.
  • verbatim: устанавливает order по умолчанию в verbatim.

Значение по умолчанию - verbatim, и dns.setDefaultResultOrder() имеет более высокий приоритет, чем --dns-result-order. При использовании рабочих потоков, dns.setDefaultResultOrder() из основного потока не повлияет на порядок dns по умолчанию в рабочих потоках.

dns.getDefaultResultOrder()

[История]

ВерсияИзменения
v22.1.0, v20.13.0Теперь поддерживается значение ipv6first.
v20.1.0, v18.17.0Добавлено в: v20.1.0, v18.17.0

Получает значение по умолчанию для order в dns.lookup() и dnsPromises.lookup(). Значение может быть:

  • ipv4first: для order, по умолчанию используется ipv4first.
  • ipv6first: для order, по умолчанию используется ipv6first.
  • verbatim: для order, по умолчанию используется verbatim.

dns.setServers(servers)

Добавлено в: v0.11.3

Устанавливает IP-адрес и порт серверов, которые будут использоваться при выполнении разрешения DNS. Аргумент servers представляет собой массив адресов в формате RFC 5952. Если порт является портом DNS по умолчанию IANA (53), его можно опустить.

js
dns.setServers(['8.8.8.8', '[2001:4860:4860::8888]', '8.8.8.8:1053', '[2001:4860:4860::8888]:1053'])

Если предоставлен недопустимый адрес, будет выдана ошибка.

Метод dns.setServers() нельзя вызывать во время выполнения запроса DNS.

Метод dns.setServers() влияет только на dns.resolve(), dns.resolve*() и dns.reverse()не на dns.lookup()).

Этот метод работает аналогично resolve.conf. То есть, если попытка разрешения с использованием первого предоставленного сервера приводит к ошибке NOTFOUND, метод resolve() не будет пытаться выполнить разрешение с использованием последующих предоставленных серверов. Запасные DNS-серверы будут использоваться только в том случае, если предыдущие серверы тайм-аутируют или приводят к какой-либо другой ошибке.

API промисов DNS

[История]

ВерсияИзменения
v15.0.0Предоставлен как require('dns/promises').
v11.14.0, v10.17.0Этот API больше не является экспериментальным.
v10.6.0Добавлено в: v10.6.0

API dns.promises предоставляет альтернативный набор асинхронных методов DNS, которые возвращают объекты Promise вместо использования обратных вызовов. API доступен через require('node:dns').promises или require('node:dns/promises').

Класс: dnsPromises.Resolver

Добавлено в: v10.6.0

Независимый преобразователь для DNS-запросов.

Создание нового преобразователя использует настройки сервера по умолчанию. Установка серверов, используемых для преобразователя, с помощью resolver.setServers() не влияет на другие преобразователи:

js
import { Resolver } from 'node:dns/promises'
const resolver = new Resolver()
resolver.setServers(['4.4.4.4'])

// Этот запрос будет использовать сервер на 4.4.4.4, независимо от глобальных настроек.
const addresses = await resolver.resolve4('example.org')
js
const { Resolver } = require('node:dns').promises
const resolver = new Resolver()
resolver.setServers(['4.4.4.4'])

// Этот запрос будет использовать сервер на 4.4.4.4, независимо от глобальных настроек.
resolver.resolve4('example.org').then(addresses => {
  // ...
})

// Альтернативно, тот же код можно записать в стиле async-await.
;(async function () {
  const addresses = await resolver.resolve4('example.org')
})()

Доступны следующие методы из API dnsPromises:

resolver.cancel()

Добавлено в: v15.3.0, v14.17.0

Отменяет все ожидающие DNS-запросы, сделанные этим резолвером. Соответствующие промисы будут отклонены с ошибкой с кодом ECANCELLED.

dnsPromises.getServers()

Добавлено в: v10.6.0

Возвращает массив строк IP-адресов, отформатированных в соответствии с RFC 5952, которые в настоящее время настроены для разрешения DNS. Строка будет включать раздел порта, если используется пользовательский порт.

js
;['8.8.8.8', '2001:4860:4860::8888', '8.8.8.8:1053', '[2001:4860:4860::8888]:1053']

dnsPromises.lookup(hostname[, options])

[История]

ВерсияИзменения
v22.1.0, v20.13.0Параметр verbatim теперь устарел в пользу нового параметра order.
v10.6.0Добавлено в: v10.6.0
  • hostname <string>
  • options <integer> | <Object>
    • family <integer> Семейство записей. Должно быть 4, 6 или 0. Значение 0 указывает, что возвращается либо адрес IPv4, либо IPv6. Если значение 0 используется с { all: true } (см. ниже), возвращается либо один, либо оба адреса IPv4 и IPv6, в зависимости от DNS-резолвера системы. По умолчанию: 0.
    • hints <number> Один или несколько поддерживаемых флагов getaddrinfo. Несколько флагов можно передать, выполнив побитовое OR их значений.
    • all <boolean> Если true, Promise разрешается со всеми адресами в массиве. В противном случае возвращается один адрес. По умолчанию: false.
    • order <string> Если verbatim, Promise разрешается с адресами IPv4 и IPv6 в том порядке, в котором их вернул DNS-резолвер. Если ipv4first, адреса IPv4 помещаются перед адресами IPv6. Если ipv6first, адреса IPv6 помещаются перед адресами IPv4. По умолчанию: verbatim (адреса не переупорядочиваются). Значение по умолчанию можно настроить с помощью dns.setDefaultResultOrder() или --dns-result-order. В новом коде следует использовать { order: 'verbatim' }.
    • verbatim <boolean> Если true, Promise разрешается с адресами IPv4 и IPv6 в том порядке, в котором их вернул DNS-резолвер. Если false, адреса IPv4 помещаются перед адресами IPv6. Этот параметр будет объявлен устаревшим в пользу order. Если указаны оба, order имеет более высокий приоритет. В новом коде следует использовать только order. По умолчанию: в настоящее время false (адреса переупорядочиваются), но ожидается, что это изменится в недалеком будущем. Значение по умолчанию можно настроить с помощью dns.setDefaultResultOrder() или --dns-result-order.

Разрешает имя хоста (например, 'nodejs.org') в первую найденную запись A (IPv4) или AAAA (IPv6). Все свойства option являются необязательными. Если options является целым числом, то оно должно быть 4 или 6 - если options не указано, то возвращаются либо адреса IPv4, либо IPv6, либо оба, если они найдены.

Если для параметра all установлено значение true, Promise разрешается, при этом addresses будет массивом объектов со свойствами address и family.

При ошибке Promise отклоняется с объектом Error, где err.code - это код ошибки. Имейте в виду, что err.code будет установлен в 'ENOTFOUND' не только тогда, когда имя хоста не существует, но и когда поиск завершается неудачей другими способами, например, из-за отсутствия доступных файловых дескрипторов.

dnsPromises.lookup() не обязательно имеет какое-либо отношение к протоколу DNS. В реализации используется механизм операционной системы, который может связывать имена с адресами и наоборот. Эта реализация может иметь тонкие, но важные последствия для поведения любой программы Node.js. Пожалуйста, потратьте некоторое время на ознакомление с разделом Рекомендации по реализации перед использованием dnsPromises.lookup().

Пример использования:

js
import dns from 'node:dns'
const dnsPromises = dns.promises
const options = {
  family: 6,
  hints: dns.ADDRCONFIG | dns.V4MAPPED,
}

await dnsPromises.lookup('example.org', options).then(result => {
  console.log('address: %j family: IPv%s', result.address, result.family)
  // address: "2606:2800:21f:cb07:6820:80da:af6b:8b2c" family: IPv6
})

// Когда options.all истинно, результатом будет массив.
options.all = true
await dnsPromises.lookup('example.org', options).then(result => {
  console.log('addresses: %j', result)
  // addresses: [{"address":"2606:2800:21f:cb07:6820:80da:af6b:8b2c","family":6}]
})
js
const dns = require('node:dns')
const dnsPromises = dns.promises
const options = {
  family: 6,
  hints: dns.ADDRCONFIG | dns.V4MAPPED,
}

dnsPromises.lookup('example.org', options).then(result => {
  console.log('address: %j family: IPv%s', result.address, result.family)
  // address: "2606:2800:21f:cb07:6820:80da:af6b:8b2c" family: IPv6
})

// Когда options.all истинно, результатом будет массив.
options.all = true
dnsPromises.lookup('example.org', options).then(result => {
  console.log('addresses: %j', result)
  // addresses: [{"address":"2606:2800:21f:cb07:6820:80da:af6b:8b2c","family":6}]
})

dnsPromises.lookupService(address, port)

Добавлено в: v10.6.0

Разрешает заданный address и port в имя хоста и сервис, используя базовую реализацию getnameinfo операционной системы.

Если address не является допустимым IP-адресом, будет выдана ошибка TypeError. port будет преобразован в число. Если он не является допустимым портом, будет выдана ошибка TypeError.

В случае ошибки Promise отклоняется с объектом Error, где err.code является кодом ошибки.

js
import dnsPromises from 'node:dns/promises'
const result = await dnsPromises.lookupService('127.0.0.1', 22)

console.log(result.hostname, result.service) // Выводит: localhost ssh
js
const dnsPromises = require('node:dns').promises
dnsPromises.lookupService('127.0.0.1', 22).then(result => {
  console.log(result.hostname, result.service)
  // Выводит: localhost ssh
})

dnsPromises.resolve(hostname[, rrtype])

Добавлено в: v10.6.0

  • hostname <string> Имя хоста для разрешения.
  • rrtype <string> Тип ресурсной записи. По умолчанию: 'A'.

Использует протокол DNS для разрешения имени хоста (например, 'nodejs.org') в массив ресурсных записей. При успехе Promise разрешается с массивом ресурсных записей. Тип и структура отдельных результатов зависят от rrtype:

rrtyperecords содержитТип результатаСокращенный метод
'A'IPv4-адреса (по умолчанию)<string>dnsPromises.resolve4()
'AAAA'IPv6-адреса<string>dnsPromises.resolve6()
'ANY'любые записи<Object>dnsPromises.resolveAny()
'CAA'записи авторизации CA<Object>dnsPromises.resolveCaa()
'CNAME'записи канонических имен<string>dnsPromises.resolveCname()
'MX'записи почтового обмена<Object>dnsPromises.resolveMx()
'NAPTR'записи указателя полномочий имени<Object>dnsPromises.resolveNaptr()
'NS'записи сервера имен<string>dnsPromises.resolveNs()
'PTR'указательные записи<string>dnsPromises.resolvePtr()
'SOA'записи начала зоны полномочий<Object>dnsPromises.resolveSoa()
'SRV'записи служб<Object>dnsPromises.resolveSrv()
'TXT'текстовые записи<string[]>dnsPromises.resolveTxt()

В случае ошибки Promise отклоняется с объектом Error, где err.code является одним из кодов ошибок DNS.

dnsPromises.resolve4(hostname[, options])

Добавлено в: v10.6.0

  • hostname <string> Имя хоста для разрешения.
  • options <Object>
    • ttl <boolean> Получить значение Time-To-Live (TTL) для каждой записи. Если true, Promise разрешается массивом объектов { address: '1.2.3.4', ttl: 60 }, а не массивом строк, при этом TTL выражается в секундах.

Использует протокол DNS для разрешения IPv4-адресов (записи A) для hostname. При успехе Promise разрешается массивом IPv4-адресов (например, ['74.125.79.104', '74.125.79.105', '74.125.79.106']).

dnsPromises.resolve6(hostname[, options])

Добавлено в: v10.6.0

  • hostname <string> Имя хоста для разрешения.
  • options <Object>
    • ttl <boolean> Получить значение Time-To-Live (TTL) для каждой записи. Если true, Promise разрешается массивом объектов { address: '0:1:2:3:4:5:6:7', ttl: 60 }, а не массивом строк, при этом TTL выражается в секундах.

Использует протокол DNS для разрешения IPv6-адресов (записи AAAA) для hostname. При успехе Promise разрешается массивом IPv6-адресов.

dnsPromises.resolveAny(hostname)

Добавлено в: v10.6.0

Использует протокол DNS для разрешения всех записей (также известных как запрос ANY или *). При успехе Promise разрешается массивом, содержащим различные типы записей. Каждый объект имеет свойство type, которое указывает тип текущей записи. И в зависимости от type, в объекте будут присутствовать дополнительные свойства:

ТипСвойства
'A'address / ttl
'AAAA'address / ttl
'CNAME'value
'MX'См. dnsPromises.resolveMx()
'NAPTR'См. dnsPromises.resolveNaptr()
'NS'value
'PTR'value
'SOA'См. dnsPromises.resolveSoa()
'SRV'См. dnsPromises.resolveSrv()
'TXT'Этот тип записи содержит свойство массива entries, которое ссылается на dnsPromises.resolveTxt() , например, { entries: ['...'], type: 'TXT' }

Вот пример результирующего объекта:

js
;[
  { type: 'A', address: '127.0.0.1', ttl: 299 },
  { type: 'CNAME', value: 'example.com' },
  { type: 'MX', exchange: 'alt4.aspmx.l.example.com', priority: 50 },
  { type: 'NS', value: 'ns1.example.com' },
  { type: 'TXT', entries: ['v=spf1 include:_spf.example.com ~all'] },
  {
    type: 'SOA',
    nsname: 'ns1.example.com',
    hostmaster: 'admin.example.com',
    serial: 156696742,
    refresh: 900,
    retry: 900,
    expire: 1800,
    minttl: 60,
  },
]

dnsPromises.resolveCaa(hostname)

Добавлено в: v15.0.0, v14.17.0

Использует протокол DNS для разрешения CAA записей для hostname. При успехе Promise разрешается массивом объектов, содержащих доступные записи авторизации центра сертификации для hostname (например, [{critical: 0, iodef: 'mailto:[email protected]'},{critical: 128, issue: 'pki.example.com'}]).

dnsPromises.resolveCname(hostname)

Добавлено в: v10.6.0

Использует протокол DNS для разрешения CNAME записей для hostname. При успехе Promise разрешается массивом записей канонических имен, доступных для hostname (например, ['bar.example.com']).

dnsPromises.resolveMx(hostname)

Добавлено в: v10.6.0

Использует протокол DNS для разрешения записей обмена почтой (MX записей) для hostname. При успехе Promise разрешается массивом объектов, содержащих свойство priority и exchange (например, [{priority: 10, exchange: 'mx.example.com'}, ...]).

dnsPromises.resolveNaptr(hostname)

Добавлено в: v10.6.0

Использует протокол DNS для разрешения записей на основе регулярных выражений (NAPTR записей) для hostname. При успехе Promise разрешается массивом объектов со следующими свойствами:

  • flags
  • service
  • regexp
  • replacement
  • order
  • preference
js
{
  flags: 's',
  service: 'SIP+D2U',
  regexp: '',
  replacement: '_sip._udp.example.com',
  order: 30,
  preference: 100
}

dnsPromises.resolveNs(hostname)

Добавлено в: v10.6.0

Использует протокол DNS для разрешения записей сервера имен (NS записей) для hostname. При успехе Promise разрешается массивом записей сервера имен, доступных для hostname (например, ['ns1.example.com', 'ns2.example.com']).

dnsPromises.resolvePtr(hostname)

Добавлено в: v10.6.0

Использует протокол DNS для разрешения записей указателей (PTR-записей) для hostname. В случае успеха Promise разрешается массивом строк, содержащих записи ответа.

dnsPromises.resolveSoa(hostname)

Добавлено в: v10.6.0

Использует протокол DNS для разрешения записи начала зоны ответственности (SOA-записи) для hostname. В случае успеха Promise разрешается объектом со следующими свойствами:

  • nsname
  • hostmaster
  • serial
  • refresh
  • retry
  • expire
  • minttl
js
{
  nsname: 'ns.example.com',
  hostmaster: 'root.example.com',
  serial: 2013101809,
  refresh: 10000,
  retry: 2400,
  expire: 604800,
  minttl: 3600
}

dnsPromises.resolveSrv(hostname)

Добавлено в: v10.6.0

Использует протокол DNS для разрешения сервисных записей (SRV-записей) для hostname. В случае успеха Promise разрешается массивом объектов со следующими свойствами:

  • priority
  • weight
  • port
  • name
js
{
  priority: 10,
  weight: 5,
  port: 21223,
  name: 'service.example.com'
}

dnsPromises.resolveTxt(hostname)

Добавлено в: v10.6.0

Использует протокол DNS для разрешения текстовых запросов (TXT-записей) для hostname. В случае успеха Promise разрешается двумерным массивом текстовых записей, доступных для hostname (например, [ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]). Каждый подмассив содержит фрагменты TXT одной записи. В зависимости от варианта использования их можно либо объединить, либо обрабатывать отдельно.

dnsPromises.reverse(ip)

Добавлено в версии: v10.6.0

Выполняет обратный DNS-запрос, который преобразует IPv4 или IPv6 адрес в массив имен хостов.

В случае ошибки, Promise отклоняется с объектом Error, где err.code является одним из кодов ошибок DNS.

dnsPromises.setDefaultResultOrder(order)

[История]

ВерсияИзменения
v22.1.0, v20.13.0Теперь поддерживается значение ipv6first.
v17.0.0Значение по умолчанию изменено на verbatim.
v16.4.0, v14.18.0Добавлено в: v16.4.0, v14.18.0
  • order <string> должен быть 'ipv4first', 'ipv6first' или 'verbatim'.

Устанавливает значение по умолчанию для order в dns.lookup() и dnsPromises.lookup(). Значение может быть:

  • ipv4first: устанавливает значение order по умолчанию в ipv4first.
  • ipv6first: устанавливает значение order по умолчанию в ipv6first.
  • verbatim: устанавливает значение order по умолчанию в verbatim.

Значение по умолчанию — verbatim, и dnsPromises.setDefaultResultOrder() имеет более высокий приоритет, чем --dns-result-order. При использовании рабочих потоков, dnsPromises.setDefaultResultOrder() из основного потока не повлияет на порядок DNS по умолчанию в рабочих потоках.

dnsPromises.getDefaultResultOrder()

Добавлено в версии: v20.1.0, v18.17.0

Получает значение dnsOrder.

dnsPromises.setServers(servers)

Добавлено в версии: v10.6.0

Устанавливает IP-адрес и порт серверов, которые будут использоваться при выполнении DNS-разрешения. Аргумент servers является массивом адресов в формате RFC 5952. Если порт является портом DNS по умолчанию IANA (53), его можно опустить.

js
dnsPromises.setServers(['8.8.8.8', '[2001:4860:4860::8888]', '8.8.8.8:1053', '[2001:4860:4860::8888]:1053'])

Ошибка будет выброшена, если указан неверный адрес.

Метод dnsPromises.setServers() не должен вызываться во время выполнения DNS-запроса.

Этот метод работает аналогично resolve.conf. То есть, если попытка разрешения с первым предоставленным сервером приводит к ошибке NOTFOUND, метод resolve() не будет пытаться выполнить разрешение со следующими предоставленными серверами. Резервные DNS-серверы будут использоваться только в том случае, если у предыдущих истечет время ожидания или возникнет какая-либо другая ошибка.

Коды ошибок

Каждый DNS-запрос может вернуть один из следующих кодов ошибок:

  • dns.NODATA: DNS-сервер вернул ответ без данных.
  • dns.FORMERR: DNS-сервер утверждает, что запрос был неправильно сформирован.
  • dns.SERVFAIL: DNS-сервер вернул общую ошибку.
  • dns.NOTFOUND: Доменное имя не найдено.
  • dns.NOTIMP: DNS-сервер не реализует запрошенную операцию.
  • dns.REFUSED: DNS-сервер отклонил запрос.
  • dns.BADQUERY: Неправильно сформированный DNS-запрос.
  • dns.BADNAME: Неправильно сформированное имя хоста.
  • dns.BADFAMILY: Неподдерживаемое семейство адресов.
  • dns.BADRESP: Неправильно сформированный DNS-ответ.
  • dns.CONNREFUSED: Не удалось связаться с DNS-серверами.
  • dns.TIMEOUT: Истекло время ожидания при связи с DNS-серверами.
  • dns.EOF: Конец файла.
  • dns.FILE: Ошибка чтения файла.
  • dns.NOMEM: Недостаточно памяти.
  • dns.DESTRUCTION: Канал уничтожается.
  • dns.BADSTR: Неправильно сформированная строка.
  • dns.BADFLAGS: Указаны недопустимые флаги.
  • dns.NONAME: Заданное имя хоста не является числовым.
  • dns.BADHINTS: Указаны недопустимые флаги подсказок.
  • dns.NOTINITIALIZED: Инициализация библиотеки c-ares еще не выполнена.
  • dns.LOADIPHLPAPI: Ошибка загрузки iphlpapi.dll.
  • dns.ADDRGETNETWORKPARAMS: Не удалось найти функцию GetNetworkParams.
  • dns.CANCELLED: DNS-запрос отменен.

API dnsPromises также экспортирует вышеуказанные коды ошибок, например, dnsPromises.NODATA.

Соображения по реализации

Хотя dns.lookup() и различные функции dns.resolve*()/dns.reverse() имеют одну и ту же цель – связать сетевое имя с сетевым адресом (или наоборот), их поведение довольно сильно отличается. Эти различия могут иметь тонкие, но существенные последствия для поведения программ Node.js.

dns.lookup()

Под капотом dns.lookup() использует те же средства операционной системы, что и большинство других программ. Например, dns.lookup() почти всегда разрешит данное имя так же, как команда ping. В большинстве POSIX-подобных операционных систем поведение функции dns.lookup() можно изменить, изменив настройки в nsswitch.conf(5) и/или resolv.conf(5), но изменение этих файлов изменит поведение всех других программ, работающих в той же операционной системе.

Хотя вызов dns.lookup() будет асинхронным с точки зрения JavaScript, он реализован как синхронный вызов getaddrinfo(3), который выполняется в пуле потоков libuv. Это может иметь неожиданные негативные последствия для производительности некоторых приложений, см. документацию UV_THREADPOOL_SIZE для получения дополнительной информации.

Различные сетевые API будут вызывать dns.lookup() внутри для разрешения имен хостов. Если это является проблемой, рассмотрите возможность разрешения имени хоста в адрес с помощью dns.resolve() и использования адреса вместо имени хоста. Кроме того, некоторые сетевые API (такие как socket.connect() и dgram.createSocket()) позволяют заменить используемый по умолчанию резолвер, dns.lookup().

dns.resolve(), dns.resolve*(), и dns.reverse()

Эти функции реализованы совершенно иначе, чем dns.lookup(). Они не используют getaddrinfo(3) и всегда выполняют DNS-запрос по сети. Эта сетевая коммуникация всегда выполняется асинхронно и не использует пул потоков libuv.

В результате, эти функции не могут оказывать такого же негативного воздействия на другую обработку, происходящую в пуле потоков libuv, как это может делать dns.lookup().

Они не используют тот же набор конфигурационных файлов, что и dns.lookup(). Например, они не используют конфигурацию из /etc/hosts.