Skip to content

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().

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

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.

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)}`)
    })
  })
})

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:

js
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) => {
  // ...
})
js
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([options])

[Historial]

VersiónCambios
v16.7.0, v14.18.0El objeto options ahora acepta una opción tries.
v12.18.3El constructor ahora acepta un objeto options. La única opción admitida es timeout.
v8.3.0Añadido en: v8.3.0

Crea un nuevo resolvedor.

  • options <Objeto>
    • timeout <entero> Tiempo de espera de la consulta en milisegundos, o -1 para usar el tiempo de espera predeterminado.
    • tries <entero> El número de intentos que el resolvedor intentará contactar a cada servidor de nombres antes de darse por vencido. Predeterminado: 4

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 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.

js
;['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ónCambios
v22.1.0, v20.13.0La opción verbatim ahora está en desuso en favor de la nueva opción order.
v18.4.0Para 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.0Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK.
v17.0.0La opción verbatim ahora tiene como valor predeterminado true.
v8.5.0La opción verbatim ahora es compatible.
v1.2.0La opción all ahora es compatible.
v0.1.90Añadido en: v0.1.90
  • hostname <string>

  • options <integer> | <Object>

    • family <integer> | <string> La familia de registros. Debe ser 4, 6 o 0. Por razones de compatibilidad con versiones anteriores, 'IPv4' y 'IPv6' se interpretan como 4 y 6 respectivamente. El valor 0 indica que se devuelve una dirección IPv4 o IPv6. Si se utiliza el valor 0 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 banderas getaddrinfo compatibles. Se pueden pasar varias banderas mediante la operación OR bit a bit de sus valores.
    • all <boolean> Cuando es true, 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 es verbatim, las direcciones resueltas se devuelven sin ordenar. Cuando es ipv4first, las direcciones resueltas se ordenan colocando las direcciones IPv4 antes de las direcciones IPv6. Cuando es ipv6first, 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 utilizando dns.setDefaultResultOrder() o --dns-result-order.
    • verbatim <boolean> Cuando es true, la devolución de llamada recibe las direcciones IPv4 e IPv6 en el orden en que las devolvió el resolvedor DNS. Cuando es false, las direcciones IPv4 se colocan antes de las direcciones IPv6. Esta opción quedará en desuso en favor de order. Cuando se especifican ambas, order tiene mayor precedencia. El código nuevo solo debe usar order. Predeterminado: true (las direcciones no se reordenan). El valor predeterminado se puede configurar utilizando dns.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 o 6, que denotan la familia de address, o 0 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:

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

// 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}]
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

// 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ónCambios
v13.13.0, v12.17.0Se 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 especifica dns.V4MAPPED, devuelve las direcciones IPv6 resueltas, así como las direcciones IPv6 mapeadas a IPv4.

dns.lookupService(address, port, callback)

[Historial]

VersiónCambios
v18.0.0Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK.
v0.11.14Añadido en: v0.11.14

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.

js
import dns from 'node:dns'
dns.lookupService('127.0.0.1', 22, (err, hostname, service) => {
  console.log(hostname, service)
  // Imprime: localhost ssh
})
js
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ónCambios
v18.0.0Pasar 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.27Añadido en: v0.1.27

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:

rrtyperecords contieneTipo de resultadoMé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ónCambios
v18.0.0Pasar 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.0Este método ahora admite el paso de options, específicamente options.ttl.
v0.1.16Añ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 es true, 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>

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ónCambios
v18.0.0Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK.
v7.2.0Este método ahora admite pasar options, específicamente options.ttl.
v0.1.16Añ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 es true, 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>

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ónCambios
v18.0.0Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK.

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:

TipoPropiedades
'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:

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,
  },
]

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ónCambios
v18.0.0Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK.
v0.3.2Añadido en: v0.3.2

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ónCambios
v18.0.0Pasar 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.0Añadido en: v15.0.0, v14.17.0

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ónCambios
v18.0.0Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK.
v0.1.27Añadido en: v0.1.27

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ónCambios
v18.0.0Pasar un callback inválido al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK.
v0.9.12Añadido en: v0.9.12

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
js
{
  flags: 's',
  service: 'SIP+D2U',
  regexp: '',
  replacement: '_sip._udp.example.com',
  order: 30,
  preference: 100
}

dns.resolveNs(hostname, callback)

[Historial]

VersiónCambios
v18.0.0Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK.
v0.1.90Añadido en: v0.1.90

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ónCambios
v18.0.0Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK.
v6.0.0Añadido en: v6.0.0

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ónCambios
v18.0.0Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK.
v0.11.10Añadido en: v0.11.10

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
js
{
  nsname: 'ns.example.com',
  hostmaster: 'root.example.com',
  serial: 2013101809,
  refresh: 10000,
  retry: 2400,
  expire: 604800,
  minttl: 3600
}

dns.resolveSrv(hostname, callback)

[Historial]

VersiónCambios
v18.0.0Pasar un callback inválido al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK.
v0.1.27Añadido en: v0.1.27

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
js
{
  priority: 10,
  weight: 5,
  port: 21223,
  name: 'service.example.com'
}

dns.resolveTxt(hostname, callback)

[Historial]

VersiónCambios
v18.0.0Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK.
v0.1.27Añadido en: v0.1.27

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

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ónCambios
v22.1.0, v20.13.0Ahora se admite el valor ipv6first.
v17.0.0Se cambió el valor predeterminado a verbatim.
v16.4.0, v14.18.0Añ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 order predeterminado en ipv4first.
  • ipv6first: establece el order predeterminado en ipv6first.
  • verbatim: establece el order predeterminado en verbatim.

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ónCambios
v22.1.0, v20.13.0Ahora se admite el valor ipv6first.
v20.1.0, v18.17.0Añ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 que order use ipv4first por defecto.
  • ipv6first: para que order use ipv6first por defecto.
  • verbatim: para que order use verbatim por defecto.

dns.setServers(servers)

Añadido en: v0.11.3

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.

js
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ónCambios
v15.0.0Expuesta como require('dns/promises').
v11.14.0, v10.17.0Esta API ya no es experimental.
v10.6.0Añ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:

js
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')
js
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.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 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.

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

dnsPromises.lookup(hostname[, options])

[Historial]

VersiónCambios
v22.1.0, v20.13.0La opción verbatim ahora está en desuso en favor de la nueva opción order.
v10.6.0Añadido en: v10.6.0
  • hostname <string>
  • options <integer> | <Object>
    • family <integer> La familia de registros. Debe ser 4, 6 o 0. El valor 0 indica que se devuelve una dirección IPv4 o IPv6. Si se utiliza el valor 0 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 flags getaddrinfo compatibles. Se pueden pasar varias flags mediante la operación bit a bit OR de sus valores.
    • all <boolean> Cuando es true, la Promise se resuelve con todas las direcciones en un array. De lo contrario, devuelve una sola dirección. Predeterminado: false.
    • order <string> Cuando es verbatim, la Promise se resuelve con direcciones IPv4 e IPv6 en el orden en que las devolvió el resolvedor DNS. Cuando es ipv4first, las direcciones IPv4 se colocan antes que las direcciones IPv6. Cuando es ipv6first, las direcciones IPv6 se colocan antes que las direcciones IPv4. Predeterminado: verbatim (las direcciones no se reordenan). El valor predeterminado es configurable usando dns.setDefaultResultOrder() o --dns-result-order. El nuevo código debe usar { order: 'verbatim' }.
    • verbatim <boolean> Cuando es true, la Promise se resuelve con direcciones IPv4 e IPv6 en el orden en que las devolvió el resolvedor DNS. Cuando es false, las direcciones IPv4 se colocan antes que las direcciones IPv6. Esta opción quedará en desuso en favor de order. Cuando ambas se especifican, order tiene mayor precedencia. El nuevo código solo debe usar order. Predeterminado: actualmente false (las direcciones se reordenan) pero se espera que esto cambie en un futuro no muy lejano. El valor predeterminado es configurable usando dns.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:

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
})

// 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}]
})
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
})

// 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.

js
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
js
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:

rrtyperecords contieneTipo de resultadoMé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 es true, la Promise 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 es true, la Promise 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

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:

TipoPropiedades
'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:

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)

Añadido en: v15.0.0, v14.17.0

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

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

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

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
js
{
  flags: 's',
  service: 'SIP+D2U',
  regexp: '',
  replacement: '_sip._udp.example.com',
  order: 30,
  preference: 100
}

dnsPromises.resolveNs(hostname)

Añadido en: v10.6.0

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

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

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
js
{
  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

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
js
{
  priority: 10,
  weight: 5,
  port: 21223,
  name: 'service.example.com'
}

dnsPromises.resolveTxt(hostname)

Añadido en: v10.6.0

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

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ónCambios
v22.1.0, v20.13.0Ahora se admite el valor ipv6first.
v17.0.0Se cambió el valor predeterminado a verbatim.
v16.4.0, v14.18.0Añ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 de order en ipv4first.
  • ipv6first: establece el valor predeterminado de order en ipv6first.
  • verbatim: establece el valor predeterminado de order en verbatim.

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

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.

js
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 cargar iphlpapi.dll.
  • dns.ADDRGETNETWORKPARAMS: No se pudo encontrar la función GetNetworkParams.
  • 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.