DNS
[Estable: 2 - Estable]
Estable: 2 Estabilidad: 2 - Estable
Código fuente: lib/dns.js
El módulo node:dns
permite la resolución de nombres. Por ejemplo, úsalo para buscar las direcciones IP de los nombres de host.
Aunque se llama así por el Sistema de nombres de dominio (DNS), no siempre utiliza el protocolo DNS para las búsquedas. dns.lookup()
utiliza las facilidades del sistema operativo para realizar la resolución de nombres. Puede que no necesite realizar ninguna comunicación de red. Para realizar la resolución de nombres de la misma manera que otras aplicaciones en el mismo sistema, utiliza dns.lookup()
.
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
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
Todas las demás funciones del módulo node:dns
se conectan a un servidor DNS real para realizar la resolución de nombres. Siempre usarán la red para realizar consultas DNS. Estas funciones no utilizan el mismo conjunto de archivos de configuración que dns.lookup()
(por ejemplo, /etc/hosts
). Utiliza estas funciones para realizar siempre consultas DNS, pasando por alto otras facilidades de resolución de nombres.
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)}`)
})
})
})
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)}`)
})
})
})
Consulta la sección Consideraciones de implementación para obtener más información.
Clase: dns.Resolver
Añadido en: v8.3.0
Un resolvedor independiente para solicitudes DNS.
La creación de un nuevo resolvedor utiliza la configuración del servidor predeterminada. Establecer los servidores utilizados para un resolvedor usando resolver.setServers()
no afecta a otros resolvedores:
import { Resolver } from 'node:dns'
const resolver = new Resolver()
resolver.setServers(['4.4.4.4'])
// Esta solicitud usará el servidor en 4.4.4.4, independientemente de la configuración global.
resolver.resolve4('example.org', (err, addresses) => {
// ...
})
const { Resolver } = require('node:dns')
const resolver = new Resolver()
resolver.setServers(['4.4.4.4'])
// Esta solicitud usará el servidor en 4.4.4.4, independientemente de la configuración global.
resolver.resolve4('example.org', (err, addresses) => {
// ...
})
Los siguientes métodos del módulo node:dns
están disponibles:
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.resolveTxt()
resolver.reverse()
resolver.setServers()
Resolver([options])
[Historial]
Versión | Cambios |
---|---|
v16.7.0, v14.18.0 | El objeto options ahora acepta una opción tries . |
v12.18.3 | El constructor ahora acepta un objeto options . La única opción admitida es timeout . |
v8.3.0 | Añadido en: v8.3.0 |
Crea un nuevo resolvedor.
options
<Objeto>
resolver.cancel()
Añadido en: v8.3.0
Cancela todas las consultas DNS pendientes realizadas por este resolvedor. Las devoluciones de llamada correspondientes se llamarán con un error con el código ECANCELLED
.
resolver.setLocalAddress([ipv4][, ipv6])
Añadido en: v15.1.0, v14.17.0
ipv4
<string> Una cadena que representa una dirección IPv4. Predeterminado:'0.0.0.0'
ipv6
<string> Una cadena que representa una dirección IPv6. Predeterminado:'::0'
La instancia del resolvedor enviará sus solicitudes desde la dirección IP especificada. Esto permite a los programas especificar interfaces salientes cuando se utilizan en sistemas con múltiples conexiones.
Si no se especifica una dirección v4 o v6, se establece en el valor predeterminado y el sistema operativo elegirá automáticamente una dirección local.
El resolvedor utilizará la dirección local v4 al realizar solicitudes a servidores DNS IPv4, y la dirección local v6 al realizar solicitudes a servidores DNS IPv6. El rrtype
de las solicitudes de resolución no tiene ningún impacto en la dirección local utilizada.
dns.getServers()
Añadido en: v0.11.3
- Devuelve: <string[]>
Devuelve un array de cadenas de direcciones IP, formateadas según RFC 5952, que están actualmente configuradas para la resolución DNS. Una cadena incluirá una sección de puerto si se utiliza un puerto personalizado.
;['8.8.8.8', '2001:4860:4860::8888', '8.8.8.8:1053', '[2001:4860:4860::8888]:1053']
dns.lookup(hostname[, options], callback)
[Historial]
Versión | Cambios |
---|---|
v22.1.0, v20.13.0 | La opción verbatim ahora está en desuso en favor de la nueva opción order . |
v18.4.0 | Para compatibilidad con node:net , al pasar un objeto de opciones, la opción family puede ser la cadena 'IPv4' o la cadena 'IPv6' . |
v18.0.0 | Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v17.0.0 | La opción verbatim ahora tiene como valor predeterminado true . |
v8.5.0 | La opción verbatim ahora es compatible. |
v1.2.0 | La opción all ahora es compatible. |
v0.1.90 | Añadido en: v0.1.90 |
hostname
<string>family
<integer> | <string> La familia de registros. Debe ser4
,6
o0
. Por razones de compatibilidad con versiones anteriores,'IPv4'
y'IPv6'
se interpretan como4
y6
respectivamente. El valor0
indica que se devuelve una dirección IPv4 o IPv6. Si se utiliza el valor0
con{ all: true }
(ver más abajo), se devuelve una o ambas direcciones IPv4 e IPv6, dependiendo del resolvedor DNS del sistema. Predeterminado:0
.hints
<number> Una o más banderasgetaddrinfo
compatibles. Se pueden pasar varias banderas mediante la operaciónOR
bit a bit de sus valores.all
<boolean> Cuando estrue
, la devolución de llamada devuelve todas las direcciones resueltas en una matriz. De lo contrario, devuelve una sola dirección. Predeterminado:false
.order
<string> Cuando esverbatim
, las direcciones resueltas se devuelven sin ordenar. Cuando esipv4first
, las direcciones resueltas se ordenan colocando las direcciones IPv4 antes de las direcciones IPv6. Cuando esipv6first
, las direcciones resueltas se ordenan colocando las direcciones IPv6 antes de las direcciones IPv4. Predeterminado:verbatim
(las direcciones no se reordenan). El valor predeterminado se puede configurar utilizandodns.setDefaultResultOrder()
o--dns-result-order
.verbatim
<boolean> Cuando estrue
, la devolución de llamada recibe las direcciones IPv4 e IPv6 en el orden en que las devolvió el resolvedor DNS. Cuando esfalse
, las direcciones IPv4 se colocan antes de las direcciones IPv6. Esta opción quedará en desuso en favor deorder
. Cuando se especifican ambas,order
tiene mayor precedencia. El código nuevo solo debe usarorder
. Predeterminado:true
(las direcciones no se reordenan). El valor predeterminado se puede configurar utilizandodns.setDefaultResultOrder()
o--dns-result-order
.
callback
<Function>err
<Error>address
<string> Una representación de cadena de una dirección IPv4 o IPv6.family
<integer>4
o6
, que denotan la familia deaddress
, o0
si la dirección no es una dirección IPv4 o IPv6.0
es un indicador probable de un error en el servicio de resolución de nombres utilizado por el sistema operativo.
Resuelve un nombre de host (por ejemplo, 'nodejs.org'
) en el primer registro A (IPv4) o AAAA (IPv6) encontrado. Todas las propiedades de option
son opcionales. Si options
es un entero, entonces debe ser 4
o 6
; si no se proporciona options
, entonces se devuelven las direcciones IPv4 o IPv6, o ambas, si se encuentran.
Con la opción all
establecida en true
, los argumentos para callback
cambian a (err, addresses)
, siendo addresses
una matriz de objetos con las propiedades address
y family
.
En caso de error, err
es un objeto Error
, donde err.code
es el código de error. Tenga en cuenta que err.code
se establecerá en 'ENOTFOUND'
no solo cuando el nombre de host no existe, sino también cuando la búsqueda falla de otras maneras, como la falta de descriptores de archivos disponibles.
dns.lookup()
no necesariamente tiene nada que ver con el protocolo DNS. La implementación utiliza una facilidad del sistema operativo que puede asociar nombres con direcciones y viceversa. Esta implementación puede tener consecuencias sutiles pero importantes en el comportamiento de cualquier programa Node.js. Dedique algún tiempo a consultar la sección Consideraciones de implementación antes de usar dns.lookup()
.
Ejemplo de uso:
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
// Cuando options.all es true, el resultado será un 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}]
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
// Cuando options.all es true, el resultado será un 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}]
Si este método se invoca como su versión util.promisify()
, y all
no está establecido en true
, devuelve una Promise
para un Object
con las propiedades address
y family
.
Banderas getaddrinfo compatibles
[Historial]
Versión | Cambios |
---|---|
v13.13.0, v12.17.0 | Se agregó compatibilidad con la bandera dns.ALL . |
Las siguientes banderas se pueden pasar como sugerencias a dns.lookup()
.
dns.ADDRCONFIG
: Limita los tipos de direcciones devueltas a los tipos de direcciones que no son de bucle invertido configuradas en el sistema. Por ejemplo, las direcciones IPv4 solo se devuelven si el sistema actual tiene al menos una dirección IPv4 configurada.dns.V4MAPPED
: Si se especificó la familia IPv6, pero no se encontraron direcciones IPv6, entonces devuelve direcciones IPv6 mapeadas a IPv4. No es compatible con algunos sistemas operativos (por ejemplo, FreeBSD 10.1).dns.ALL
: Si se especificadns.V4MAPPED
, devuelve las direcciones IPv6 resueltas, así como las direcciones IPv6 mapeadas a IPv4.
dns.lookupService(address, port, callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v0.11.14 | Añadido en: v0.11.14 |
address
<string>port
<number>callback
<Function>
Resuelve la address
y el port
dados en un nombre de host y un servicio usando la implementación subyacente getnameinfo
del sistema operativo.
Si address
no es una dirección IP válida, se lanzará un TypeError
. El port
se forzará a un número. Si no es un puerto legal, se lanzará un TypeError
.
En caso de error, err
es un objeto Error
, donde err.code
es el código de error.
import dns from 'node:dns'
dns.lookupService('127.0.0.1', 22, (err, hostname, service) => {
console.log(hostname, service)
// Imprime: localhost ssh
})
const dns = require('node:dns')
dns.lookupService('127.0.0.1', 22, (err, hostname, service) => {
console.log(hostname, service)
// Imprime: localhost ssh
})
Si este método se invoca como su versión util.promisify()
, devuelve una Promise
para un Object
con las propiedades hostname
y service
.
dns.resolve(hostname[, rrtype], callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una función de devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v0.1.27 | Añadido en: v0.1.27 |
hostname
<string> Nombre de host a resolver.rrtype
<string> Tipo de registro de recurso. Predeterminado:'A'
.callback
<Function>err
<Error>records
<string[]> | <Object[]> | <Object>
Utiliza el protocolo DNS para resolver un nombre de host (por ejemplo, 'nodejs.org'
) en una matriz de registros de recursos. La función callback
tiene los argumentos (err, records)
. Si se realiza correctamente, records
será una matriz de registros de recursos. El tipo y la estructura de los resultados individuales varían según rrtype
:
rrtype | records contiene | Tipo de resultado | Método abreviado |
---|---|---|---|
'A' | Direcciones IPv4 (predeterminado) | <string> | dns.resolve4() |
'AAAA' | Direcciones IPv6 | <string> | dns.resolve6() |
'ANY' | cualquier registro | <Object> | dns.resolveAny() |
'CAA' | registros de autorización de CA | <Object> | dns.resolveCaa() |
'CNAME' | registros de nombre canónico | <string> | dns.resolveCname() |
'MX' | registros de intercambio de correo | <Object> | dns.resolveMx() |
'NAPTR' | registros de puntero de autoridad de nombre | <Object> | dns.resolveNaptr() |
'NS' | registros de servidor de nombres | <string> | dns.resolveNs() |
'PTR' | registros de puntero | <string> | dns.resolvePtr() |
'SOA' | registros de inicio de autoridad | <Object> | dns.resolveSoa() |
'SRV' | registros de servicio | <Object> | dns.resolveSrv() |
'TXT' | registros de texto | <string[]> | dns.resolveTxt() |
En caso de error, err
es un objeto Error
, donde err.code
es uno de los códigos de error de DNS.
dns.resolve4(hostname[, options], callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una función de devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v7.2.0 | Este método ahora admite el paso de options , específicamente options.ttl . |
v0.1.16 | Añadido en: v0.1.16 |
hostname
<string> Nombre de host a resolver.options
<Object>ttl
<boolean> Recupera el valor de Tiempo de vida (TTL) de cada registro. Cuando estrue
, la función de devolución de llamada recibe un array de objetos{ address: '1.2.3.4', ttl: 60 }
en lugar de un array de strings, con el TTL expresado en segundos.
callback
<Function>err
<Error>addresses
<string[]> | <Object[]>
Utiliza el protocolo DNS para resolver las direcciones IPv4 (A
records) para el hostname
. El argumento addresses
pasado a la función callback
contendrá un array de direcciones IPv4 (por ejemplo, ['74.125.79.104', '74.125.79.105', '74.125.79.106']
).
dns.resolve6(hostname[, options], callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v7.2.0 | Este método ahora admite pasar options , específicamente options.ttl . |
v0.1.16 | Añadido en: v0.1.16 |
hostname
<string> Nombre de host a resolver.options
<Object>ttl
<boolean> Recuperar el valor de Tiempo de vida (TTL) de cada registro. Cuando estrue
, la devolución de llamada recibe un array de objetos{ address: '0:1:2:3:4:5:6:7', ttl: 60 }
en lugar de un array de strings, con el TTL expresado en segundos.
callback
<Function>err
<Error>addresses
<string[]> | <Object[]>
Usa el protocolo DNS para resolver direcciones IPv6 (AAAA
records) para el hostname
. El argumento addresses
pasado a la función callback
contendrá un array de direcciones IPv6.
dns.resolveAny(hostname, callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
hostname
<string>callback
<Function>err
<Error>ret
<Object[]>
Utiliza el protocolo DNS para resolver todos los registros (también conocido como consulta ANY
o *
). El argumento ret
pasado a la función callback
será una matriz que contiene varios tipos de registros. Cada objeto tiene una propiedad type
que indica el tipo del registro actual. Y dependiendo del type
, habrá propiedades adicionales presentes en el objeto:
Tipo | Propiedades |
---|---|
'A' | address / ttl |
'AAAA' | address / ttl |
'CNAME' | value |
'MX' | Referirse a dns.resolveMx() |
'NAPTR' | Referirse a dns.resolveNaptr() |
'NS' | value |
'PTR' | value |
'SOA' | Referirse a dns.resolveSoa() |
'SRV' | Referirse a dns.resolveSrv() |
'TXT' | Este tipo de registro contiene una propiedad de matriz llamada entries que se refiere a dns.resolveTxt() , por ejemplo { entries: ['...'], type: 'TXT' } |
Aquí hay un ejemplo del objeto ret
pasado a la devolución de llamada:
;[
{ 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,
},
]
Los operadores del servidor DNS pueden optar por no responder a las consultas ANY
. Puede ser mejor llamar a métodos individuales como dns.resolve4()
, dns.resolveMx()
, etc. Para más detalles, consulte RFC 8482.
dns.resolveCname(hostname, callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v0.3.2 | Añadido en: v0.3.2 |
hostname
<string>callback
<Function>err
<Error>addresses
<string[]>
Utiliza el protocolo DNS para resolver registros CNAME
para el hostname
. El argumento addresses
pasado a la función callback
contendrá un array de registros de nombres canónicos disponibles para el hostname
(ej. ['bar.example.com']
).
dns.resolveCaa(hostname, callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v15.0.0, v14.17.0 | Añadido en: v15.0.0, v14.17.0 |
hostname
<string>callback
<Function>err
<Error>records
<Object[]>
Utiliza el protocolo DNS para resolver registros CAA
para el hostname
. El argumento addresses
pasado a la función callback
contendrá un array de registros de autorización de autoridad de certificación disponibles para el hostname
(ej. [{critical: 0, iodef: 'mailto:[email protected]'}, {critical: 128, issue: 'pki.example.com'}]
).
dns.resolveMx(hostname, callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v0.1.27 | Añadido en: v0.1.27 |
hostname
<string>callback
<Function>err
<Error>addresses
<Object[]>
Utiliza el protocolo DNS para resolver registros de intercambio de correo (MX
) para el hostname
. El argumento addresses
pasado a la función callback
contendrá un array de objetos que contienen una propiedad priority
y exchange
(ej. [{priority: 10, exchange: 'mx.example.com'}, ...]
).
dns.resolveNaptr(hostname, callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar un callback inválido al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v0.9.12 | Añadido en: v0.9.12 |
hostname
<string>callback
<Function>err
<Error>addresses
<Object[]>
Utiliza el protocolo DNS para resolver registros basados en expresiones regulares (NAPTR
records) para el hostname
. El argumento addresses
pasado a la función callback
contendrá un array de objetos con las siguientes propiedades:
flags
service
regexp
replacement
order
preference
{
flags: 's',
service: 'SIP+D2U',
regexp: '',
replacement: '_sip._udp.example.com',
order: 30,
preference: 100
}
dns.resolveNs(hostname, callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v0.1.90 | Añadido en: v0.1.90 |
hostname
<string>callback
<Function>err
<Error>addresses
<string[]>
Utiliza el protocolo DNS para resolver registros de servidor de nombres (NS
records) para el hostname
. El argumento addresses
pasado a la función callback
contendrá un array de registros de servidor de nombres disponibles para hostname
(ej. ['ns1.example.com', 'ns2.example.com']
).
dns.resolvePtr(hostname, callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v6.0.0 | Añadido en: v6.0.0 |
hostname
<string>callback
<Function>err
<Error>addresses
<string[]>
Utiliza el protocolo DNS para resolver registros de puntero (PTR
records) para el hostname
. El argumento addresses
pasado a la función callback
será un array de strings conteniendo los registros de respuesta.
dns.resolveSoa(hostname, callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v0.11.10 | Añadido en: v0.11.10 |
hostname
<string>callback
<Function>
Utiliza el protocolo DNS para resolver un registro de inicio de autoridad (SOA
record) para el hostname
. El argumento address
pasado a la función callback
será un objeto con las siguientes propiedades:
nsname
hostmaster
serial
refresh
retry
expire
minttl
{
nsname: 'ns.example.com',
hostmaster: 'root.example.com',
serial: 2013101809,
refresh: 10000,
retry: 2400,
expire: 604800,
minttl: 3600
}
dns.resolveSrv(hostname, callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar un callback inválido al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v0.1.27 | Añadido en: v0.1.27 |
hostname
<string>callback
<Function>err
<Error>addresses
<Object[]>
Utiliza el protocolo DNS para resolver registros de servicio (SRV
records) para el hostname
. El argumento addresses
pasado a la función callback
será un array de objetos con las siguientes propiedades:
priority
weight
port
name
{
priority: 10,
weight: 5,
port: 21223,
name: 'service.example.com'
}
dns.resolveTxt(hostname, callback)
[Historial]
Versión | Cambios |
---|---|
v18.0.0 | Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v0.1.27 | Añadido en: v0.1.27 |
hostname
<string>callback
<Function>err
<Error>records
<string[][]>
Utiliza el protocolo DNS para resolver consultas de texto (TXT
records) para el hostname
. El argumento records
pasado a la función callback
es un array bidimensional de los registros de texto disponibles para hostname
(ej. [ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]
). Cada sub-array contiene fragmentos TXT de un registro. Dependiendo del caso de uso, estos podrían unirse o tratarse por separado.
dns.reverse(ip, callback)
Añadido en: v0.1.16
ip
<string>callback
<Function>err
<Error>hostnames
<string[]>
Realiza una consulta DNS inversa que resuelve una dirección IPv4 o IPv6 en una matriz de nombres de host.
En caso de error, err
es un objeto Error
, donde err.code
es uno de los códigos de error DNS.
dns.setDefaultResultOrder(order)
[Historial]
Versión | Cambios |
---|---|
v22.1.0, v20.13.0 | Ahora se admite el valor ipv6first . |
v17.0.0 | Se cambió el valor predeterminado a verbatim . |
v16.4.0, v14.18.0 | Añadido en: v16.4.0, v14.18.0 |
order
<string> debe ser'ipv4first'
,'ipv6first'
o'verbatim'
.
Establece el valor predeterminado de order
en dns.lookup()
y dnsPromises.lookup()
. El valor puede ser:
ipv4first
: establece elorder
predeterminado enipv4first
.ipv6first
: establece elorder
predeterminado enipv6first
.verbatim
: establece elorder
predeterminado enverbatim
.
El valor predeterminado es verbatim
y dns.setDefaultResultOrder()
tiene mayor prioridad que --dns-result-order
. Cuando se utilizan hilos de trabajo, dns.setDefaultResultOrder()
del hilo principal no afectará a los pedidos dns predeterminados en los trabajadores.
dns.getDefaultResultOrder()
[Historial]
Versión | Cambios |
---|---|
v22.1.0, v20.13.0 | Ahora se admite el valor ipv6first . |
v20.1.0, v18.17.0 | Añadido en: v20.1.0, v18.17.0 |
Obtiene el valor predeterminado para order
en dns.lookup()
y dnsPromises.lookup()
. El valor puede ser:
ipv4first
: para queorder
useipv4first
por defecto.ipv6first
: para queorder
useipv6first
por defecto.verbatim
: para queorder
useverbatim
por defecto.
dns.setServers(servers)
Añadido en: v0.11.3
servers
<string[]> array de direcciones con formato RFC 5952
Establece la dirección IP y el puerto de los servidores que se utilizarán al realizar la resolución DNS. El argumento servers
es un array de direcciones con formato RFC 5952. Si el puerto es el puerto DNS predeterminado de IANA (53), se puede omitir.
dns.setServers(['8.8.8.8', '[2001:4860:4860::8888]', '8.8.8.8:1053', '[2001:4860:4860::8888]:1053'])
Se lanzará un error si se proporciona una dirección no válida.
El método dns.setServers()
no se debe llamar mientras haya una consulta DNS en progreso.
El método dns.setServers()
solo afecta a dns.resolve()
, dns.resolve*()
y dns.reverse()
(y específicamente no a dns.lookup()
).
Este método funciona de forma muy similar a resolve.conf. Es decir, si intentar resolver con el primer servidor proporcionado da como resultado un error NOTFOUND
, el método resolve()
no intentará resolver con los servidores posteriores proporcionados. Los servidores DNS de reserva solo se utilizarán si los anteriores se agotan o producen algún otro error.
API de promesas DNS
[Historial]
Versión | Cambios |
---|---|
v15.0.0 | Expuesta como require('dns/promises') . |
v11.14.0, v10.17.0 | Esta API ya no es experimental. |
v10.6.0 | Añadida en: v10.6.0 |
La API dns.promises
proporciona un conjunto alternativo de métodos DNS asíncronos que devuelven objetos Promise
en lugar de usar callbacks. Se puede acceder a la API a través de require('node:dns').promises
o require('node:dns/promises')
.
Clase: dnsPromises.Resolver
Añadida en: v10.6.0
Un resolutor independiente para solicitudes DNS.
La creación de un nuevo resolutor utiliza la configuración del servidor predeterminada. Establecer los servidores utilizados para un resolutor usando resolver.setServers()
no afecta a otros resolutores:
import { Resolver } from 'node:dns/promises'
const resolver = new Resolver()
resolver.setServers(['4.4.4.4'])
// Esta solicitud usará el servidor en 4.4.4.4, independientemente de la configuración global.
const addresses = await resolver.resolve4('example.org')
const { Resolver } = require('node:dns').promises
const resolver = new Resolver()
resolver.setServers(['4.4.4.4'])
// Esta solicitud usará el servidor en 4.4.4.4, independientemente de la configuración global.
resolver.resolve4('example.org').then(addresses => {
// ...
})
// Alternativamente, el mismo código se puede escribir usando el estilo async-await.
;(async function () {
const addresses = await resolver.resolve4('example.org')
})()
Los siguientes métodos de la API dnsPromises
están disponibles:
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.resolveTxt()
resolver.reverse()
resolver.setServers()
resolver.cancel()
Añadido en: v15.3.0, v14.17.0
Cancela todas las consultas DNS pendientes realizadas por este resolvedor. Las promesas correspondientes serán rechazadas con un error con el código ECANCELLED
.
dnsPromises.getServers()
Añadido en: v10.6.0
- Devuelve: <string[]>
Devuelve un array de cadenas de direcciones IP, formateadas según RFC 5952, que están actualmente configuradas para la resolución DNS. Una cadena incluirá una sección de puerto si se utiliza un puerto personalizado.
;['8.8.8.8', '2001:4860:4860::8888', '8.8.8.8:1053', '[2001:4860:4860::8888]:1053']
dnsPromises.lookup(hostname[, options])
[Historial]
Versión | Cambios |
---|---|
v22.1.0, v20.13.0 | La opción verbatim ahora está en desuso en favor de la nueva opción order . |
v10.6.0 | Añadido en: v10.6.0 |
hostname
<string>options
<integer> | <Object>family
<integer> La familia de registros. Debe ser4
,6
o0
. El valor0
indica que se devuelve una dirección IPv4 o IPv6. Si se utiliza el valor0
con{ all: true }
(ver más abajo), se devuelve una o ambas direcciones IPv4 e IPv6, dependiendo del resolvedor DNS del sistema. Predeterminado:0
.hints
<number> Una o más flagsgetaddrinfo
compatibles. Se pueden pasar varias flags mediante la operación bit a bitOR
de sus valores.all
<boolean> Cuando estrue
, laPromise
se resuelve con todas las direcciones en un array. De lo contrario, devuelve una sola dirección. Predeterminado:false
.order
<string> Cuando esverbatim
, laPromise
se resuelve con direcciones IPv4 e IPv6 en el orden en que las devolvió el resolvedor DNS. Cuando esipv4first
, las direcciones IPv4 se colocan antes que las direcciones IPv6. Cuando esipv6first
, las direcciones IPv6 se colocan antes que las direcciones IPv4. Predeterminado:verbatim
(las direcciones no se reordenan). El valor predeterminado es configurable usandodns.setDefaultResultOrder()
o--dns-result-order
. El nuevo código debe usar{ order: 'verbatim' }
.verbatim
<boolean> Cuando estrue
, laPromise
se resuelve con direcciones IPv4 e IPv6 en el orden en que las devolvió el resolvedor DNS. Cuando esfalse
, las direcciones IPv4 se colocan antes que las direcciones IPv6. Esta opción quedará en desuso en favor deorder
. Cuando ambas se especifican,order
tiene mayor precedencia. El nuevo código solo debe usarorder
. Predeterminado: actualmentefalse
(las direcciones se reordenan) pero se espera que esto cambie en un futuro no muy lejano. El valor predeterminado es configurable usandodns.setDefaultResultOrder()
o--dns-result-order
.
Resuelve un nombre de host (por ejemplo, 'nodejs.org'
) en el primer registro A (IPv4) o AAAA (IPv6) encontrado. Todas las propiedades option
son opcionales. Si options
es un entero, entonces debe ser 4
o 6
– si no se proporciona options
, entonces se devuelven direcciones IPv4 o IPv6, o ambas, si se encuentran.
Con la opción all
establecida en true
, la Promise
se resuelve con addresses
siendo un array de objetos con las propiedades address
y family
.
En caso de error, la Promise
se rechaza con un objeto Error
, donde err.code
es el código de error. Tenga en cuenta que err.code
se establecerá en 'ENOTFOUND'
no solo cuando el nombre de host no existe, sino también cuando la búsqueda falla de otras maneras, como la falta de descriptores de archivos disponibles.
dnsPromises.lookup()
no necesariamente tiene nada que ver con el protocolo DNS. La implementación utiliza una facilidad del sistema operativo que puede asociar nombres con direcciones y viceversa. Esta implementación puede tener consecuencias sutiles pero importantes en el comportamiento de cualquier programa Node.js. Dedique algún tiempo a consultar la sección Consideraciones de implementación antes de usar dnsPromises.lookup()
.
Ejemplo de uso:
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}]
})
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)
Añadido en: v10.6.0
Resuelve la address
y el port
dados en un nombre de host y servicio usando la implementación subyacente getnameinfo
del sistema operativo.
Si address
no es una dirección IP válida, se lanzará un TypeError
. El port
se forzará a un número. Si no es un puerto legal, se lanzará un TypeError
.
En caso de error, la Promise
se rechaza con un objeto Error
, donde err.code
es el código de error.
import dnsPromises from 'node:dns/promises'
const result = await dnsPromises.lookupService('127.0.0.1', 22)
console.log(result.hostname, result.service) // Imprime: localhost ssh
const dnsPromises = require('node:dns').promises
dnsPromises.lookupService('127.0.0.1', 22).then(result => {
console.log(result.hostname, result.service)
// Imprime: localhost ssh
})
dnsPromises.resolve(hostname[, rrtype])
Añadido en: v10.6.0
hostname
<string> Nombre de host a resolver.rrtype
<string> Tipo de registro de recursos. Predeterminado:'A'
.
Utiliza el protocolo DNS para resolver un nombre de host (por ejemplo, 'nodejs.org'
) en una matriz de los registros de recursos. Si se realiza correctamente, la Promise
se resuelve con una matriz de registros de recursos. El tipo y la estructura de los resultados individuales varían según rrtype
:
rrtype | records contiene | Tipo de resultado | Método abreviado |
---|---|---|---|
'A' | Direcciones IPv4 (predeterminado) | <string> | dnsPromises.resolve4() |
'AAAA' | Direcciones IPv6 | <string> | dnsPromises.resolve6() |
'ANY' | cualquier registro | <Object> | dnsPromises.resolveAny() |
'CAA' | registros de autorización de CA | <Object> | dnsPromises.resolveCaa() |
'CNAME' | registros de nombre canónico | <string> | dnsPromises.resolveCname() |
'MX' | registros de intercambio de correo | <Object> | dnsPromises.resolveMx() |
'NAPTR' | registros de puntero de autoridad de nombre | <Object> | dnsPromises.resolveNaptr() |
'NS' | registros de servidor de nombres | <string> | dnsPromises.resolveNs() |
'PTR' | registros de puntero | <string> | dnsPromises.resolvePtr() |
'SOA' | registros de inicio de autoridad | <Object> | dnsPromises.resolveSoa() |
'SRV' | registros de servicio | <Object> | dnsPromises.resolveSrv() |
'TXT' | registros de texto | <string[]> | dnsPromises.resolveTxt() |
En caso de error, la Promise
se rechaza con un objeto Error
, donde err.code
es uno de los códigos de error de DNS.
dnsPromises.resolve4(hostname[, options])
Añadido en: v10.6.0
hostname
<string> Nombre de host a resolver.options
<Object>ttl
<boolean> Recuperar el valor de Tiempo de vida (TTL) de cada registro. Cuando estrue
, laPromise
se resuelve con un array de objetos{ address: '1.2.3.4', ttl: 60 }
en lugar de un array de strings, con el TTL expresado en segundos.
Utiliza el protocolo DNS para resolver direcciones IPv4 (A
records) para el hostname
. En caso de éxito, la Promise
se resuelve con un array de direcciones IPv4 (por ejemplo, ['74.125.79.104', '74.125.79.105', '74.125.79.106']
).
dnsPromises.resolve6(hostname[, options])
Añadido en: v10.6.0
hostname
<string> Nombre de host a resolver.options
<Object>ttl
<boolean> Recuperar el valor de Tiempo de vida (TTL) de cada registro. Cuando estrue
, laPromise
se resuelve con un array de objetos{ address: '0:1:2:3:4:5:6:7', ttl: 60 }
en lugar de un array de strings, con el TTL expresado en segundos.
Utiliza el protocolo DNS para resolver direcciones IPv6 (AAAA
records) para el hostname
. En caso de éxito, la Promise
se resuelve con un array de direcciones IPv6.
dnsPromises.resolveAny(hostname)
Añadido en: v10.6.0
hostname
<string>
Usa el protocolo DNS para resolver todos los registros (también conocido como consulta ANY
o *
). Si se realiza correctamente, la Promise
se resuelve con una matriz que contiene varios tipos de registros. Cada objeto tiene una propiedad type
que indica el tipo del registro actual. Y dependiendo del type
, habrá propiedades adicionales presentes en el objeto:
Tipo | Propiedades |
---|---|
'A' | address / ttl |
'AAAA' | address / ttl |
'CNAME' | value |
'MX' | Ver dnsPromises.resolveMx() |
'NAPTR' | Ver dnsPromises.resolveNaptr() |
'NS' | value |
'PTR' | value |
'SOA' | Ver dnsPromises.resolveSoa() |
'SRV' | Ver dnsPromises.resolveSrv() |
'TXT' | Este tipo de registro contiene una propiedad de matriz llamada entries que se refiere a dnsPromises.resolveTxt() , p. ej. { entries: ['...'], type: 'TXT' } |
Aquí hay un ejemplo del objeto resultado:
;[
{ 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)
Añadido en: v15.0.0, v14.17.0
hostname
<string>
Utiliza el protocolo DNS para resolver registros CAA
para el hostname
. Si se realiza correctamente, la Promise
se resuelve con una matriz de objetos que contienen los registros de autorización de autoridad de certificación disponibles para el hostname
(por ejemplo, [{critical: 0, iodef: 'mailto:[email protected]'},{critical: 128, issue: 'pki.example.com'}]
).
dnsPromises.resolveCname(hostname)
Añadido en: v10.6.0
hostname
<string>
Utiliza el protocolo DNS para resolver registros CNAME
para el hostname
. Si se realiza correctamente, la Promise
se resuelve con una matriz de registros de nombre canónico disponibles para el hostname
(por ejemplo, ['bar.example.com']
).
dnsPromises.resolveMx(hostname)
Añadido en: v10.6.0
hostname
<string>
Utiliza el protocolo DNS para resolver registros de intercambio de correo (MX
records) para el hostname
. Si se realiza correctamente, la Promise
se resuelve con una matriz de objetos que contienen una propiedad priority
y exchange
(por ejemplo, [{priority: 10, exchange: 'mx.example.com'}, ...]
).
dnsPromises.resolveNaptr(hostname)
Añadido en: v10.6.0
hostname
<string>
Usa el protocolo DNS para resolver registros basados en expresiones regulares (NAPTR
records) para el hostname
. Si tiene éxito, la Promise
se resuelve con un array de objetos con las siguientes propiedades:
flags
service
regexp
replacement
order
preference
{
flags: 's',
service: 'SIP+D2U',
regexp: '',
replacement: '_sip._udp.example.com',
order: 30,
preference: 100
}
dnsPromises.resolveNs(hostname)
Añadido en: v10.6.0
hostname
<string>
Usa el protocolo DNS para resolver registros de servidor de nombres (NS
records) para el hostname
. Si tiene éxito, la Promise
se resuelve con un array de registros de servidor de nombres disponibles para hostname
(ej. ['ns1.example.com', 'ns2.example.com']
).
dnsPromises.resolvePtr(hostname)
Añadido en: v10.6.0
hostname
<string>
Utiliza el protocolo DNS para resolver registros de puntero (PTR
records) para el hostname
. Si tiene éxito, la Promise
se resuelve con un array de strings que contienen los registros de respuesta.
dnsPromises.resolveSoa(hostname)
Añadido en: v10.6.0
hostname
<string>
Utiliza el protocolo DNS para resolver un registro de inicio de autoridad (SOA
record) para el hostname
. Si tiene éxito, la Promise
se resuelve con un objeto con las siguientes propiedades:
nsname
hostmaster
serial
refresh
retry
expire
minttl
{
nsname: 'ns.example.com',
hostmaster: 'root.example.com',
serial: 2013101809,
refresh: 10000,
retry: 2400,
expire: 604800,
minttl: 3600
}
dnsPromises.resolveSrv(hostname)
Añadido en: v10.6.0
hostname
<string>
Utiliza el protocolo DNS para resolver registros de servicio (SRV
records) para el hostname
. Si tiene éxito, la Promise
se resuelve con un array de objetos con las siguientes propiedades:
priority
weight
port
name
{
priority: 10,
weight: 5,
port: 21223,
name: 'service.example.com'
}
dnsPromises.resolveTxt(hostname)
Añadido en: v10.6.0
hostname
<string>
Utiliza el protocolo DNS para resolver consultas de texto (TXT
records) para el hostname
. Si se realiza correctamente, la Promise
se resuelve con una matriz bidimensional de los registros de texto disponibles para hostname
(por ejemplo, [ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]
). Cada submatriz contiene fragmentos TXT de un registro. Dependiendo del caso de uso, estos podrían unirse o tratarse por separado.
dnsPromises.reverse(ip)
Añadido en: v10.6.0
ip
<string>
Realiza una consulta DNS inversa que resuelve una dirección IPv4 o IPv6 en una matriz de nombres de host.
En caso de error, la Promise
se rechaza con un objeto Error
, donde err.code
es uno de los códigos de error de DNS.
dnsPromises.setDefaultResultOrder(order)
[Historial]
Versión | Cambios |
---|---|
v22.1.0, v20.13.0 | Ahora se admite el valor ipv6first . |
v17.0.0 | Se cambió el valor predeterminado a verbatim . |
v16.4.0, v14.18.0 | Añadido en: v16.4.0, v14.18.0 |
order
<string> debe ser'ipv4first'
,'ipv6first'
o'verbatim'
.
Establece el valor predeterminado de order
en dns.lookup()
y dnsPromises.lookup()
. El valor puede ser:
ipv4first
: establece el valor predeterminado deorder
enipv4first
.ipv6first
: establece el valor predeterminado deorder
enipv6first
.verbatim
: establece el valor predeterminado deorder
enverbatim
.
El valor predeterminado es verbatim
y dnsPromises.setDefaultResultOrder()
tiene mayor prioridad que --dns-result-order
. Cuando se utilizan hilos de trabajo, dnsPromises.setDefaultResultOrder()
del hilo principal no afectará a los pedidos DNS predeterminados en los trabajadores.
dnsPromises.getDefaultResultOrder()
Añadido en: v20.1.0, v18.17.0
Obtiene el valor de dnsOrder
.
dnsPromises.setServers(servers)
Añadido en: v10.6.0
servers
<string[]> array de direcciones con formato RFC 5952
Establece la dirección IP y el puerto de los servidores que se utilizarán al realizar la resolución DNS. El argumento servers
es un array de direcciones con formato RFC 5952. Si el puerto es el puerto DNS predeterminado de IANA (53), se puede omitir.
dnsPromises.setServers(['8.8.8.8', '[2001:4860:4860::8888]', '8.8.8.8:1053', '[2001:4860:4860::8888]:1053'])
Se lanzará un error si se proporciona una dirección no válida.
El método dnsPromises.setServers()
no se debe llamar mientras una consulta DNS esté en progreso.
Este método funciona de forma muy similar a resolve.conf. Es decir, si intentar resolver con el primer servidor proporcionado resulta en un error NOTFOUND
, el método resolve()
no intentará resolver con los servidores posteriores proporcionados. Los servidores DNS de reserva solo se usarán si los anteriores caducan o producen algún otro error.
Códigos de error
Cada consulta DNS puede devolver uno de los siguientes códigos de error:
dns.NODATA
: El servidor DNS devolvió una respuesta sin datos.dns.FORMERR
: El servidor DNS afirma que la consulta tenía un formato incorrecto.dns.SERVFAIL
: El servidor DNS devolvió un error general.dns.NOTFOUND
: Nombre de dominio no encontrado.dns.NOTIMP
: El servidor DNS no implementa la operación solicitada.dns.REFUSED
: El servidor DNS rechazó la consulta.dns.BADQUERY
: Consulta DNS con formato incorrecto.dns.BADNAME
: Nombre de host con formato incorrecto.dns.BADFAMILY
: Familia de direcciones no compatible.dns.BADRESP
: Respuesta DNS con formato incorrecto.dns.CONNREFUSED
: No se pudo contactar con los servidores DNS.dns.TIMEOUT
: Tiempo de espera agotado al contactar con los servidores DNS.dns.EOF
: Fin del archivo.dns.FILE
: Error al leer el archivo.dns.NOMEM
: Falta de memoria.dns.DESTRUCTION
: El canal se está destruyendo.dns.BADSTR
: Cadena con formato incorrecto.dns.BADFLAGS
: Se especificaron indicadores ilegales.dns.NONAME
: El nombre de host dado no es numérico.dns.BADHINTS
: Se especificaron indicadores de sugerencias ilegales.dns.NOTINITIALIZED
: La inicialización de la biblioteca c-ares aún no se ha realizado.dns.LOADIPHLPAPI
: Error al cargariphlpapi.dll
.dns.ADDRGETNETWORKPARAMS
: No se pudo encontrar la funciónGetNetworkParams
.dns.CANCELLED
: Consulta DNS cancelada.
La API dnsPromises
también exporta los códigos de error anteriores, por ejemplo, dnsPromises.NODATA
.
Consideraciones de implementación
Aunque dns.lookup()
y las varias funciones dns.resolve*()/dns.reverse()
tienen el mismo objetivo de asociar un nombre de red con una dirección de red (o viceversa), su comportamiento es bastante diferente. Estas diferencias pueden tener consecuencias sutiles pero significativas en el comportamiento de los programas Node.js.
dns.lookup()
Bajo el capó, dns.lookup()
utiliza las mismas facilidades del sistema operativo que la mayoría de los otros programas. Por ejemplo, dns.lookup()
casi siempre resolverá un nombre dado de la misma manera que el comando ping
. En la mayoría de los sistemas operativos tipo POSIX, el comportamiento de la función dns.lookup()
puede modificarse cambiando la configuración en nsswitch.conf(5)
y/o resolv.conf(5)
, pero cambiar estos archivos cambiará el comportamiento de todos los demás programas que se ejecuten en el mismo sistema operativo.
Aunque la llamada a dns.lookup()
será asíncrona desde la perspectiva de JavaScript, se implementa como una llamada sincrónica a getaddrinfo(3)
que se ejecuta en el grupo de subprocesos de libuv. Esto puede tener implicaciones negativas sorprendentes en el rendimiento para algunas aplicaciones, consulte la documentación de UV_THREADPOOL_SIZE
para obtener más información.
Varias APIs de red llamarán a dns.lookup()
internamente para resolver nombres de host. Si eso es un problema, considere resolver el nombre de host a una dirección usando dns.resolve()
y usar la dirección en lugar de un nombre de host. Además, algunas APIs de red (como socket.connect()
y dgram.createSocket()
) permiten reemplazar el resolvedor predeterminado, dns.lookup()
.
dns.resolve()
, dns.resolve*()
, y dns.reverse()
Estas funciones están implementadas de manera bastante diferente a dns.lookup()
. No utilizan getaddrinfo(3)
y siempre realizan una consulta DNS en la red. Esta comunicación de red siempre se realiza de forma asíncrona y no utiliza el threadpool de libuv.
Como resultado, estas funciones no pueden tener el mismo impacto negativo en otros procesos que ocurren en el threadpool de libuv que dns.lookup()
puede tener.
No utilizan el mismo conjunto de archivos de configuración que dns.lookup()
. Por ejemplo, no utilizan la configuración de /etc/hosts
.