DNS
Исходный код: lib/dns.js
Модуль node:dns обеспечивает разрешение имен. Например, с его помощью можно найти IP-адреса имен хостов.
Несмотря на название, связанное с системой доменных имен (DNS), для поиска не всегда используется протокол DNS. dns.lookup() использует средства операционной системы для разрешения имен. Для этого может не потребоваться сетевое взаимодействие. Чтобы выполнять разрешение имен так же, как другие приложения в той же системе, используйте dns.lookup().
Модули JavaScript
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: IPv6CommonJS
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-запросы в обход других средств разрешения имен.
Модули JavaScript
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)}`);
});
});
});CommonJS
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
Независимый резолвер для DNS-запросов.
При создании нового резолвера используются настройки сервера по умолчанию. Настройка серверов, используемых резолвером, с помощью resolver.setServers() не влияет на другие резолверы:
Модули JavaScript
import { Resolver } from 'node:dns';
const resolver = new Resolver();
resolver.setServers(['4.4.4.4']);
// This request will use the server at 4.4.4.4, independent of global settings.
resolver.resolve4('example.org', (err, addresses) => {
// ...
});CommonJS
const { Resolver } = require('node:dns');
const resolver = new Resolver();
resolver.setServers(['4.4.4.4']);
// This request will use the server at 4.4.4.4, independent of global settings.
resolver.resolve4('example.org', (err, addresses) => {
// ...
});Доступны следующие методы модуля node:dns:
resolver.getServers()resolver.resolve()resolver.resolve4()resolver.resolve6()resolver.resolveAny()resolver.resolveCaa()resolver.resolveCname()resolver.resolveMx()resolver.resolveNaptr()resolver.resolveNs()resolver.resolvePtr()resolver.resolveSoa()resolver.resolveSrv()resolver.resolveTlsa()resolver.resolveTxt()resolver.reverse()resolver.setServers()
Resolver([options])
Создает новый резолвер.
-
options<Object>-
timeout<integer> Тайм-аут запроса в миллисекундах или-1для использования тайм-аута по умолчанию. -
tries<integer> Количество попыток связаться с каждым сервером имен, прежде чем резолвер прекратит работу. По умолчанию:4 -
maxTimeout<integer> Максимальный тайм-аут повторной попытки в миллисекундах. По умолчанию:0, отключено.
-
resolver.cancel()
Отменяет все незавершенные DNS-запросы, выполненные этим резолвером. Соответствующие обратные вызовы будут вызваны с ошибкой с кодом ECANCELLED.
resolver.setLocalAddress([ipv4][, ipv6])
-
ipv4<string> Строковое представление адреса IPv4. По умолчанию:'0.0.0.0' -
ipv6<string> Строковое представление адреса IPv6. По умолчанию:'::0'
Экземпляр резолвера будет отправлять запросы с указанного IP-адреса. Это позволяет программам задавать исходящие интерфейсы при работе в системах с несколькими сетевыми интерфейсами.
Если адрес v4 или v6 не указан, ему присваивается значение по умолчанию, а операционная система автоматически выбирает локальный адрес.
При отправке запросов DNS-серверам IPv4 резолвер использует локальный адрес v4, а при запросах DNS-серверам IPv6 — локальный адрес v6. rrtype запросов разрешения имен не влияет на используемый локальный адрес.
dns.getServers()
- Возвращает: <string[]>
Возвращает массив строк с IP-адресами, отформатированными в соответствии с RFC 5952, которые в данный момент настроены для разрешения DNS-имен. Если используется пользовательский порт, строка будет содержать его номер.
[ '8.8.8.8', '2001:4860:4860::8888', '8.8.8.8:1053', '[2001:4860:4860::8888]:1053', ] copy
dns.lookup(hostname[, options], callback)
-
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>
Разрешает имя хоста (например, '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() ознакомьтесь с разделом Особенности реализации.
Пример использования:
Модули JavaScript
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
// When options.all is true, the result will be an 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}]CommonJS
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
// When options.all is true, the result will be an 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
Следующие флаги можно передать в качестве подсказок методу dns.lookup().
-
dns.ADDRCONFIG: ограничивает возвращаемые типы адресов типами нелокальных адресов, настроенных в системе. Например, адреса IPv4 возвращаются, только если в текущей системе настроен хотя бы один адрес IPv4. -
dns.V4MAPPED: если указано семейство IPv6, но адреса IPv6 не найдены, возвращаются адреса IPv4, сопоставленные с IPv6. Не поддерживается в некоторых операционных системах (например, FreeBSD 10.1). -
dns.ALL: если указаноdns.V4MAPPED, возвращает разрешенные адреса IPv6, а также адреса IPv4, сопоставленные с IPv6.
dns.lookupService(address, port, callback)
-
address<string> -
port<number> -
callback<Function>
Разрешает указанные address и port в имя хоста и службу с помощью встроенной реализации getnameinfo операционной системы.
Если address не является допустимым IP-адресом, будет выброшено исключение TypeError. Значение port будет преобразовано в число. Если это недопустимый порт, будет выброшено исключение TypeError.
В случае ошибки err является объектом Error, где err.code — код ошибки.
Модули JavaScript
import dns from 'node:dns';
dns.lookupService('127.0.0.1', 22, (err, hostname, service) => {
console.log(hostname, service);
// Prints: localhost ssh
});CommonJS
const dns = require('node:dns');
dns.lookupService('127.0.0.1', 22, (err, hostname, service) => {
console.log(hostname, service);
// Prints: localhost ssh
});Если этот метод вызывается в версии, преобразованной с помощью util.promisify(), он возвращает Promise для Object со свойствами hostname и service.
dns.resolve(hostname[, rrtype], callback)
-
hostname<string> Имя хоста для разрешения. -
rrtype<string> Тип ресурсной записи. По умолчанию:'A'. -
callback<Function>-
err<Error> -
records<string[]> | <Object[]> | <Object>
-
Использует протокол DNS для разрешения имени хоста (например, 'nodejs.org') в массив ресурсных записей. Функция callback принимает аргументы (err, records). При успешном выполнении records будет массивом ресурсных записей. Тип и структура отдельных результатов зависят от rrtype:
rrtype |
records содержит |
Тип результата | Сокращенный метод |
|---|---|---|---|
'A' |
адреса IPv4 (по умолчанию) | <string> | dns.resolve4() |
'AAAA' |
адреса IPv6 | <string> | dns.resolve6() |
'ANY' |
любые записи | <Object> | dns.resolveAny() |
'CAA' |
записи авторизации центра сертификации (CA) | <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() |
'TLSA' |
связи с сертификатами | <Object> | dns.resolveTlsa() |
'TXT' |
текстовые записи | <string[]> | dns.resolveTxt() |
В случае ошибки err является объектом Error, где err.code — один из кодов ошибок DNS.
dns.resolve4(hostname[, options], callback)
-
hostname<string> Имя хоста для разрешения. -
options<Object>-
ttl<boolean> Получает значение Time-To-Live (TTL) каждой записи. Если значение равноtrue, обратный вызов получает массив объектов{ address: '1.2.3.4', ttl: 60 }вместо массива строк; значение TTL указывается в секундах.
-
-
callback<Function>-
err<Error> -
addresses<string[]> | <Object[]>
-
Использует протокол DNS для разрешения адресов IPv4 (записей A) для hostname. Аргумент addresses, переданный функции callback, будет содержать массив адресов IPv4 (например, ['74.125.79.104', '74.125.79.105', '74.125.79.106']).
dns.resolve6(hostname[, options], callback)
-
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>-
err<Error> -
addresses<string[]> | <Object[]>
-
Использует протокол DNS для разрешения адресов IPv6 (записей AAAA) для hostname. Аргумент addresses, переданный функции callback, будет содержать массив адресов IPv6.
dns.resolveAny(hostname, callback)
-
hostname<string> -
callback<Function>-
err<Error> -
ret<Object[]>
-
Использует протокол 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()
|
'TLSA' |
См. dns.resolveTlsa()
|
'TXT' |
Запись этого типа содержит свойство-массив с именем entries, которое ссылается на dns.resolveTxt(), например { entries: ['...'], type: 'TXT' }
|
Ниже приведен пример объекта ret, передаваемого функции обратного вызова:
[ { 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 } ] copy Операторы DNS-серверов могут не отвечать на запросы ANY. Возможно, лучше вызывать отдельные методы, такие как dns.resolve4(), dns.resolveMx() и другие. Подробнее см. в документе RFC 8482.
dns.resolveCname(hostname, callback)
-
hostname<string> -
callback<Function>-
err<Error> -
addresses<string[]>
-
Использует протокол DNS для разрешения записей CNAME для hostname. Аргумент addresses, переданный функции callback, будет содержать массив канонических записей имени, доступных для hostname (например, ['bar.example.com']).
dns.resolveCaa(hostname, callback)
-
hostname<string> -
callback<Function>-
err<Error> -
records<Object[]>
-
Использует протокол DNS для разрешения записей CAA для hostname. Аргумент addresses, переданный функции callback, будет содержать массив записей авторизации центра сертификации, доступных для hostname (например, [{critical: 0, iodef: 'mailto:pki@example.com'}, {critical: 128, issue: 'pki.example.com'}]).
dns.resolveMx(hostname, callback)
-
hostname<string> -
callback<Function>-
err<Error> -
addresses<Object[]>
-
Использует протокол DNS для разрешения записей почтового обмена (записей MX) для hostname. Аргумент addresses, переданный функции callback, будет содержать массив объектов со свойствами priority и exchange (например, [{priority: 10, exchange: 'mx.example.com'}, ...]).
dns.resolveNaptr(hostname, callback)
-
hostname<string> -
callback<Function>-
err<Error> -
addresses<Object[]>
-
Использует протокол DNS для разрешения записей на основе регулярных выражений (записей NAPTR) для hostname. Аргумент addresses, переданный функции callback, будет содержать массив объектов со следующими свойствами:
flagsserviceregexpreplacementorderpreference
{
flags: 's',
service: 'SIP+D2U',
regexp: '',
replacement: '_sip._udp.example.com',
order: 30,
preference: 100
} copy
dns.resolveNs(hostname, callback)
-
hostname<string> -
callback<Function>-
err<Error> -
addresses<string[]>
-
Использует протокол DNS для разрешения записей сервера имен (записей NS) для hostname. Аргумент addresses, переданный функции callback, будет содержать массив записей серверов имен, доступных для hostname (например, ['ns1.example.com', 'ns2.example.com']).
dns.resolvePtr(hostname, callback)
-
hostname<string> -
callback<Function>-
err<Error> -
addresses<string[]>
-
Использует протокол DNS для разрешения записей указателя (записей PTR) для hostname. Аргумент addresses, переданный функции callback, будет массивом строк, содержащих записи ответа.
dns.resolveSoa(hostname, callback)
-
hostname<string> -
callback<Function>
Использует протокол DNS для разрешения записи начала полномочий (записи SOA) для hostname. Аргумент address, переданный функции callback, будет объектом со следующими свойствами:
nsnamehostmasterserialrefreshretryexpireminttl
{
nsname: 'ns.example.com',
hostmaster: 'root.example.com',
serial: 2013101809,
refresh: 10000,
retry: 2400,
expire: 604800,
minttl: 3600
} copy
dns.resolveSrv(hostname, callback)
-
hostname<string> -
callback<Function>-
err<Error> -
addresses<Object[]>
-
Использует протокол DNS для разрешения записей службы (записей SRV) для hostname. Аргумент addresses, переданный функции callback, будет массивом объектов со следующими свойствами:
priorityweightportname
{
priority: 10,
weight: 5,
port: 21223,
name: 'service.example.com'
} copy
dns.resolveTlsa(hostname, callback)
-
hostname<string> -
callback<Function>-
err<Error> -
records<Object[]>
-
Использует протокол DNS для разрешения записей ассоциации сертификатов (записей TLSA) для hostname. Аргумент records, переданный функции callback, представляет собой массив объектов со следующими свойствами:
certUsageselectormatchdata
{
certUsage: 3,
selector: 1,
match: 1,
data: [ArrayBuffer]
} copy
dns.resolveTxt(hostname, callback)
-
hostname<string> -
callback<Function>-
err<Error> -
records<string[]>
-
Использует протокол DNS для разрешения текстовых запросов (записей TXT) для hostname. Аргумент records, переданный функции callback, представляет собой двумерный массив текстовых записей, доступных для hostname (например, [ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]). Каждый вложенный массив содержит фрагменты TXT одной записи. В зависимости от сценария использования их можно объединить или обрабатывать по отдельности.
dns.reverse(ip, callback)
-
ip<string> -
callback<Function>-
err<Error> -
hostnames<string[]>
-
Выполняет обратный DNS-запрос, преобразующий адрес IPv4 или IPv6 в массив имен хостов.
В случае ошибки err является объектом Error, где err.code — один из кодов ошибок DNS.
dns.setDefaultResultOrder(order)
-
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()
Возвращает значение по умолчанию для order в dns.lookup() и dnsPromises.lookup(). Возможные значения:
-
ipv4first: дляorderсо значением по умолчаниюipv4first. -
ipv6first: дляorderсо значением по умолчаниюipv6first. -
verbatim: дляorderсо значением по умолчаниюverbatim.
dns.setServers(servers)
-
servers<string[]> массив адресов в формате RFC 5952
Задает IP-адреса и порты серверов, используемых при разрешении DNS-имен. Аргумент servers — это массив адресов в формате RFC 5952. Если используется порт DNS по умолчанию, установленный IANA (53), его можно не указывать.
dns.setServers([ '8.8.8.8', '[2001:4860:4860::8888]', '8.8.8.8:1053', '[2001:4860:4860::8888]:1053', ]); copy
Если указан недопустимый адрес, будет выброшено исключение.
Метод dns.setServers() нельзя вызывать, пока выполняется DNS-запрос.
Метод dns.setServers() влияет только на dns.resolve(), dns.resolve*() и dns.reverse() (и, в частности, не влияет на dns.lookup()).
Этот метод работает примерно так же, как resolve.conf. То есть, если попытка разрешения имени с помощью первого указанного сервера приводит к ошибке NOTFOUND, метод resolve() не будет пытаться выполнить разрешение с помощью последующих серверов. Резервные DNS-серверы будут использоваться только в том случае, если предыдущие серверы не отвечают вовремя или возвращают другую ошибку.
API promises DNS
API dns.promises предоставляет альтернативный набор асинхронных методов DNS, которые возвращают объекты Promise вместо использования обратных вызовов. Доступ к API осуществляется через require('node:dns').promises или require('node:dns/promises').
Класс: dnsPromises.Resolver
Независимый резолвер для DNS-запросов.
Новый резолвер создается с настройками сервера по умолчанию. Настройка серверов для резолвера с помощью resolver.setServers() не влияет на другие резолверы:
Модули JavaScript
import { Resolver } from 'node:dns/promises';
const resolver = new Resolver();
resolver.setServers(['4.4.4.4']);
// This request will use the server at 4.4.4.4, independent of global settings.
const addresses = await resolver.resolve4('example.org');CommonJS
const { Resolver } = require('node:dns').promises;
const resolver = new Resolver();
resolver.setServers(['4.4.4.4']);
// This request will use the server at 4.4.4.4, independent of global settings.
resolver.resolve4('example.org').then((addresses) => {
// ...
});
// Alternatively, the same code can be written using async-await style.
(async function() {
const addresses = await resolver.resolve4('example.org');
})();Доступны следующие методы из API dnsPromises:
resolver.getServers()resolver.resolve()resolver.resolve4()resolver.resolve6()resolver.resolveAny()resolver.resolveCaa()resolver.resolveCname()resolver.resolveMx()resolver.resolveNaptr()resolver.resolveNs()resolver.resolvePtr()resolver.resolveSoa()resolver.resolveSrv()resolver.resolveTlsa()resolver.resolveTxt()resolver.reverse()resolver.setServers()
resolver.cancel()
Отменяет все ожидающие DNS-запросы, выполненные этим резолвером. Соответствующие промисы будут отклонены с ошибкой с кодом ECANCELLED.
dnsPromises.getServers()
- Возвращает: <string[]>
Возвращает массив строк IP-адресов в формате RFC 5952, настроенных в данный момент для разрешения DNS-имен. Если используется нестандартный порт, строка будет включать его.
[ '8.8.8.8', '2001:4860:4860::8888', '8.8.8.8:1053', '[2001:4860:4860::8888]:1053', ] copy
dnsPromises.lookup(hostname[, options])
-
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() ознакомьтесь с разделом Рекомендации по реализации.
Пример использования:
Модули JavaScript
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
});
// When options.all is true, the result will be an Array.
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}]
});CommonJS
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
});
// When options.all is true, the result will be an Array.
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)
Преобразует заданные address и port в имя хоста и службу с помощью базовой реализации getnameinfo операционной системы.
Если address не является допустимым IP-адресом, будет выброшено исключение TypeError. Значение port будет преобразовано в число. Если оно не является допустимым номером порта, будет выброшено исключение TypeError.
В случае ошибки промис Promise отклоняется с объектом Error, где err.code — код ошибки.
Модули JavaScript
import dnsPromises from 'node:dns/promises';
const result = await dnsPromises.lookupService('127.0.0.1', 22);
console.log(result.hostname, result.service); // Prints: localhost sshCommonJS
const dnsPromises = require('node:dns').promises;
dnsPromises.lookupService('127.0.0.1', 22).then((result) => {
console.log(result.hostname, result.service);
// Prints: localhost ssh
});
dnsPromises.resolve(hostname[, rrtype])
-
hostname<string> Имя хоста для разрешения. -
rrtype<string> Тип ресурсной записи. По умолчанию:'A'.
Использует протокол DNS для преобразования имени хоста (например, 'nodejs.org') в массив ресурсных записей. В случае успеха промис Promise разрешается массивом ресурсных записей. Тип и структура отдельных результатов зависят от rrtype:
rrtype |
records содержит |
Тип результата | Сокращенный метод |
|---|---|---|---|
'A' |
адреса IPv4 (по умолчанию) | <string> | dnsPromises.resolve4() |
'AAAA' |
адреса IPv6 | <string> | dnsPromises.resolve6() |
'ANY' |
любые записи | <Object> | dnsPromises.resolveAny() |
'CAA' |
записи авторизации центра сертификации | <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() |
'TLSA' |
ассоциации сертификатов | <Object> | dnsPromises.resolveTlsa() |
'TXT' |
текстовые записи | <string[]> | dnsPromises.resolveTxt() |
В случае ошибки промис Promise отклоняется с объектом Error, где err.code — один из кодов ошибок DNS.
dnsPromises.resolve4(hostname[, options])
-
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])
-
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)
-
hostname<string>
Использует протокол 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()
|
'TLSA' |
См. dnsPromises.resolveTlsa()
|
'TXT' |
Этот тип записи содержит свойство-массив с именем entries, которое относится к dnsPromises.resolveTxt(), например { entries: ['...'], type: 'TXT' }
|
Пример объекта результата:
[ { 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 } ] copy
dnsPromises.resolveCaa(hostname)
-
hostname<string>
Использует протокол DNS для разрешения записей CAA для hostname. В случае успеха промис Promise разрешается массивом объектов, содержащих доступные записи авторизации центра сертификации для hostname (например, [{critical: 0, iodef: 'mailto:pki@example.com'},{critical: 128, issue: 'pki.example.com'}]).
dnsPromises.resolveCname(hostname)
-
hostname<string>
Использует протокол DNS для разрешения записей CNAME для hostname. В случае успеха промис Promise разрешается массивом записей канонических имен, доступных для hostname (например, ['bar.example.com']).
dnsPromises.resolveMx(hostname)
-
hostname<string>
Использует протокол DNS для разрешения записей почтового обмена (записей MX) для hostname. В случае успеха промис Promise разрешается массивом объектов, содержащих свойства priority и exchange (например, [{priority: 10, exchange: 'mx.example.com'}, ...]).
dnsPromises.resolveNaptr(hostname)
-
hostname<string>
Использует протокол DNS для разрешения записей на основе регулярных выражений (записей NAPTR) для hostname. В случае успеха промис Promise разрешается массивом объектов со следующими свойствами:
flagsserviceregexpreplacementorderpreference
{
flags: 's',
service: 'SIP+D2U',
regexp: '',
replacement: '_sip._udp.example.com',
order: 30,
preference: 100
} copy
dnsPromises.resolveNs(hostname)
-
hostname<string>
Использует протокол DNS для разрешения записей серверов имен (записей NS) для hostname. В случае успеха промис Promise разрешается массивом записей серверов имен, доступных для hostname (например, ['ns1.example.com', 'ns2.example.com']).
dnsPromises.resolvePtr(hostname)
-
hostname<string>
Использует протокол DNS для разрешения записей указателей (записей PTR) для hostname. В случае успеха промис Promise разрешается массивом строк, содержащих записи ответа.
dnsPromises.resolveSoa(hostname)
-
hostname<string>
Использует протокол DNS для разрешения записи начала зоны полномочий (записи SOA) для hostname. В случае успеха промис Promise разрешается объектом со следующими свойствами:
nsnamehostmasterserialrefreshretryexpireminttl
{
nsname: 'ns.example.com',
hostmaster: 'root.example.com',
serial: 2013101809,
refresh: 10000,
retry: 2400,
expire: 604800,
minttl: 3600
} copy
dnsPromises.resolveSrv(hostname)
-
hostname<string>
Использует протокол DNS для разрешения записей служб (записей SRV) для hostname. В случае успеха промис Promise разрешается массивом объектов со следующими свойствами:
priorityweightportname
{
priority: 10,
weight: 5,
port: 21223,
name: 'service.example.com'
} copy
dnsPromises.resolveTlsa(hostname)
-
hostname<string>
Использует протокол DNS для разрешения ассоциаций сертификатов (записей TLSA) для hostname. В случае успеха промис Promise разрешается массивом объектов со следующими свойствами:
certUsageselectormatchdata
{
certUsage: 3,
selector: 1,
match: 1,
data: [ArrayBuffer]
} copy
dnsPromises.resolveTxt(hostname)
-
hostname<string>
Использует протокол DNS для разрешения текстовых запросов (записей TXT) для hostname. В случае успеха промис Promise разрешается двумерным массивом текстовых записей, доступных для hostname (например, [ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]). Каждый вложенный массив содержит фрагменты TXT одной записи. В зависимости от сценария использования их можно объединить или обрабатывать по отдельности.
dnsPromises.reverse(ip)
-
ip<string>
Выполняет обратный DNS-запрос, преобразующий адрес IPv4 или IPv6 в массив имен хостов.
В случае ошибки промис Promise отклоняется с объектом Error, где err.code — один из кодов ошибок DNS.
dnsPromises.setDefaultResultOrder(order)
-
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()
Возвращает значение dnsOrder.
dnsPromises.setServers(servers)
-
servers<string[]> массив адресов в формате RFC 5952
Задает IP-адреса и порты серверов, которые будут использоваться при разрешении DNS-имен. Аргумент servers — это массив адресов в формате RFC 5952. Если используется порт DNS по умолчанию, установленный IANA (53), его можно не указывать.
dnsPromises.setServers([ '8.8.8.8', '[2001:4860:4860::8888]', '8.8.8.8:1053', '[2001:4860:4860::8888]:1053', ]); copy
Если указан недопустимый адрес, будет выброшено исключение.
Метод 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), однако изменение этих файлов повлияет на поведение всех остальных программ, работающих в той же операционной системе.
Хотя с точки зрения JavaScript вызов dns.lookup() является асинхронным, он реализован как синхронный вызов 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.
© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v22.x/docs/api/dns.html