Skip to content

DNS

[Stable: 2 - Estável]

Stable: 2 Estabilidade: 2 - Estável

Código Fonte: lib/dns.js

O módulo node:dns habilita a resolução de nomes. Por exemplo, use-o para procurar endereços IP de nomes de host.

Embora seja nomeado para o Sistema de Nomes de Domínio (DNS), ele nem sempre usa o protocolo DNS para pesquisas. dns.lookup() usa as instalações do sistema operacional para realizar a resolução de nomes. Pode não precisar realizar nenhuma comunicação de rede. Para realizar a resolução de nomes da mesma forma que outros aplicativos no mesmo sistema, use 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 as outras funções no módulo node:dns conectam-se a um servidor DNS real para realizar a resolução de nomes. Elas sempre usarão a rede para realizar consultas DNS. Essas funções não usam o mesmo conjunto de arquivos de configuração usados por dns.lookup() (por exemplo, /etc/hosts). Use essas funções para sempre realizar consultas DNS, ignorando outras instalações de resolução de nomes.

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

Consulte a seção Considerações de implementação para mais informações.

Classe: dns.Resolver

Adicionado em: v8.3.0

Um resolvedor independente para requisições DNS.

Criar um novo resolvedor usa as configurações padrão do servidor. Configurar os servidores usados para um resolvedor usando resolver.setServers() não afeta outros resolvedores:

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

// Esta requisição usará o servidor em 4.4.4.4, independente das configurações globais.
resolver.resolve4('example.org', (err, addresses) => {
  // ...
})
js
const { Resolver } = require('node:dns')
const resolver = new Resolver()
resolver.setServers(['4.4.4.4'])

// Esta requisição usará o servidor em 4.4.4.4, independente das configurações globais.
resolver.resolve4('example.org', (err, addresses) => {
  // ...
})

Os seguintes métodos do módulo node:dns estão disponíveis:

Resolver([options])

[Histórico]

VersãoMudanças
v16.7.0, v14.18.0O objeto options agora aceita uma opção tries.
v12.18.3O construtor agora aceita um objeto options. A única opção suportada é timeout.
v8.3.0Adicionado em: v8.3.0

Cria um novo resolvedor.

  • options <Object>
    • timeout <integer> Tempo limite da consulta em milissegundos, ou -1 para usar o tempo limite padrão.
    • tries <integer> O número de tentativas que o resolvedor fará para contatar cada servidor de nome antes de desistir. Padrão: 4

resolver.cancel()

Adicionado em: v8.3.0

Cancela todas as consultas DNS pendentes feitas por este resolvedor. Os callbacks correspondentes serão chamados com um erro com o código ECANCELLED.

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

Adicionado em: v15.1.0, v14.17.0

  • ipv4 <string> Uma representação de string de um endereço IPv4. Padrão: '0.0.0.0'
  • ipv6 <string> Uma representação de string de um endereço IPv6. Padrão: '::0'

A instância do resolvedor enviará suas solicitações do endereço IP especificado. Isso permite que os programas especifiquem interfaces de saída quando usados em sistemas multi-homed.

Se um endereço v4 ou v6 não for especificado, ele será definido como o padrão e o sistema operacional escolherá um endereço local automaticamente.

O resolvedor usará o endereço local v4 ao fazer solicitações para servidores DNS IPv4 e o endereço local v6 ao fazer solicitações para servidores DNS IPv6. O rrtype das solicitações de resolução não tem impacto no endereço local usado.

dns.getServers()

Adicionado em: v0.11.3

Retorna um array de strings de endereço IP, formatado de acordo com RFC 5952, que estão atualmente configurados para resolução de DNS. Uma string incluirá uma seção de porta se uma porta personalizada for usada.

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

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

[Histórico]

VersãoMudanças
v22.1.0, v20.13.0A opção verbatim agora está obsoleta em favor da nova opção order.
v18.4.0Para compatibilidade com node:net, ao passar um objeto de opção, a opção family pode ser a string 'IPv4' ou a string 'IPv6'.
v18.0.0Passar um callback inválido para o argumento callback agora gera ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK.
v17.0.0As opções verbatim agora são padronizadas como true.
v8.5.0A opção verbatim agora é suportada.
v1.2.0A opção all agora é suportada.
v0.1.90Adicionado em: v0.1.90
  • hostname <string>

  • options <integer> | <Object>

    • family <integer> | <string> A família do registro. Deve ser 4, 6 ou 0. Por motivos de compatibilidade com versões anteriores,'IPv4' e 'IPv6' são interpretados como 4 e 6, respectivamente. O valor 0 indica que um endereço IPv4 ou IPv6 é retornado. Se o valor 0 for usado com { all: true } (veja abaixo), um ou ambos os endereços IPv4 e IPv6 serão retornados, dependendo do resolvedor de DNS do sistema. Padrão: 0.
    • hints <number> Um ou mais flags getaddrinfo suportados. Vários flags podem ser passados por meio de OR bit a bit seus valores.
    • all <boolean> Quando true, o callback retorna todos os endereços resolvidos em um array. Caso contrário, retorna um único endereço. Padrão: false.
    • order <string> Quando verbatim, os endereços resolvidos são retornados não ordenados. Quando ipv4first, os endereços resolvidos são classificados colocando os endereços IPv4 antes dos endereços IPv6. Quando ipv6first, os endereços resolvidos são classificados colocando os endereços IPv6 antes dos endereços IPv4. Padrão: verbatim (os endereços não são reordenados). O valor padrão é configurável usando dns.setDefaultResultOrder() ou --dns-result-order.
    • verbatim <boolean> Quando true, o callback recebe endereços IPv4 e IPv6 na ordem em que o resolvedor DNS os retornou. Quando false, os endereços IPv4 são colocados antes dos endereços IPv6. Esta opção será descontinuada em favor de order. Quando ambos são especificados, order tem maior precedência. O novo código deve usar apenas order. Padrão: true (os endereços não são reordenados). O valor padrão é configurável usando dns.setDefaultResultOrder() ou --dns-result-order.
  • callback <Function>

    • err <Error>
    • address <string> Uma representação de string de um endereço IPv4 ou IPv6.
    • family <integer> 4 ou 6, denotando a família de address, ou 0 se o endereço não for um endereço IPv4 ou IPv6. 0 é um indicador provável de um bug no serviço de resolução de nomes usado pelo sistema operacional.

Resolve um nome de host (por exemplo, 'nodejs.org') no primeiro registro A (IPv4) ou AAAA (IPv6) encontrado. Todas as propriedades option são opcionais. Se options for um inteiro, então deve ser 4 ou 6 – se options não for fornecido, então endereços IPv4 ou IPv6, ou ambos, serão retornados se encontrados.

Com a opção all definida como true, os argumentos para callback mudam para (err, addresses), com addresses sendo um array de objetos com as propriedades address e family.

Em caso de erro, err é um objeto Error, onde err.code é o código de erro. Lembre-se de que err.code será definido como 'ENOTFOUND' não apenas quando o nome do host não existir, mas também quando a pesquisa falhar de outras maneiras, como nenhum descritor de arquivo disponível.

dns.lookup() não tem necessariamente nada a ver com o protocolo DNS. A implementação usa um recurso do sistema operacional que pode associar nomes a endereços e vice-versa. Essa implementação pode ter consequências sutis, mas importantes, no comportamento de qualquer programa Node.js. Reserve algum tempo para consultar a seção Considerações sobre a implementação antes de usar dns.lookup().

Exemplo 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

// Quando options.all é true, o resultado será um 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

// Quando options.all é true, o resultado será um 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}]

Se este método for invocado como sua versão util.promisify()ed, e all não for definido como true, ele retornará uma Promise para um Object com as propriedades address e family.

Flags getaddrinfo suportadas

[Histórico]

VersãoAlterações
v13.13.0, v12.17.0Adicionado suporte para a flag dns.ALL.

As seguintes flags podem ser passadas como dicas para dns.lookup().

  • dns.ADDRCONFIG: Limita os tipos de endereço retornados aos tipos de endereços não loopback configurados no sistema. Por exemplo, os endereços IPv4 só são retornados se o sistema atual tiver pelo menos um endereço IPv4 configurado.
  • dns.V4MAPPED: Se a família IPv6 foi especificada, mas nenhum endereço IPv6 foi encontrado, retorna endereços IPv6 mapeados para IPv4. Não é suportado em alguns sistemas operacionais (por exemplo, FreeBSD 10.1).
  • dns.ALL: Se dns.V4MAPPED for especificado, retorna endereços IPv6 resolvidos, bem como endereços IPv6 mapeados para IPv4.

dns.lookupService(address, port, callback)

[Histórico]

VersãoAlterações
v18.0.0Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK.
v0.11.14Adicionado em: v0.11.14

Resolve o address e port fornecidos para um nome de host e serviço usando a implementação getnameinfo subjacente do sistema operacional.

Se address não for um endereço IP válido, um TypeError será lançado. O port será convertido para um número. Se não for uma porta legal, um TypeError será lançado.

Em caso de erro, err é um objeto Error, onde err.code é o código de erro.

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

Se este método for invocado como sua versão util.promisify()ed, ele retorna uma Promise para um Object com as propriedades hostname e service.

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

[Histórico]

VersãoMudanças
v18.0.0Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK.
v0.1.27Adicionado em: v0.1.27

Utiliza o protocolo DNS para resolver um nome de host (por exemplo, 'nodejs.org') em um array de registros de recursos. A função callback tem argumentos (err, records). Quando bem-sucedido, records será um array de registros de recursos. O tipo e a estrutura dos resultados individuais variam com base em rrtype:

rrtyperecords contémTipo de resultadoMétodo abreviado
'A'Endereços IPv4 (padrão)<string>dns.resolve4()
'AAAA'Endereços IPv6<string>dns.resolve6()
'ANY'quaisquer registros<Object>dns.resolveAny()
'CAA'registros de autorização CA<Object>dns.resolveCaa()
'CNAME'registros de nome canônico<string>dns.resolveCname()
'MX'registros de troca de e-mail<Object>dns.resolveMx()
'NAPTR'registros de ponteiro de autoridade de nome<Object>dns.resolveNaptr()
'NS'registros de servidor de nome<string>dns.resolveNs()
'PTR'registros de ponteiro<string>dns.resolvePtr()
'SOA'registros de início de autoridade<Object>dns.resolveSoa()
'SRV'registros de serviço<Object>dns.resolveSrv()
'TXT'registros de texto<string[]>dns.resolveTxt()

Em caso de erro, err é um objeto Error, onde err.code é um dos códigos de erro DNS.

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

[Histórico]

VersãoMudanças
v18.0.0Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK.
v7.2.0Este método agora suporta passar options, especificamente options.ttl.
v0.1.16Adicionado em: v0.1.16
  • hostname <string> Nome do host a ser resolvido.

  • options <Objeto>

    • ttl <booleano> Recupera o valor de Time-To-Live (TTL) de cada registro. Quando true, o callback recebe um array de objetos { address: '1.2.3.4', ttl: 60 } em vez de um array de strings, com o TTL expresso em segundos.
  • callback <Função>

Usa o protocolo DNS para resolver endereços IPv4 (registros A) para o hostname. O argumento addresses passado para a função callback conterá um array de endereços IPv4 (por exemplo, ['74.125.79.104', '74.125.79.105', '74.125.79.106']).

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

[Histórico]

VersãoMudanças
v18.0.0Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK.
v7.2.0Este método agora suporta passar options, especificamente options.ttl.
v0.1.16Adicionado em: v0.1.16
  • hostname <string> Nome do host a ser resolvido.

  • options <Objeto>

    • ttl <booleano> Recupera o valor de Time-To-Live (TTL) de cada registro. Quando true, o callback recebe um array de objetos { address: '0:1:2:3:4:5:6:7', ttl: 60 } em vez de um array de strings, com o TTL expresso em segundos.
  • callback <Função>

Usa o protocolo DNS para resolver endereços IPv6 (registros AAAA) para o hostname. O argumento addresses passado para a função callback conterá um array de endereços IPv6.

dns.resolveAny(hostname, callback)

[Histórico]

VersãoMudanças
v18.0.0Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK.

Usa o protocolo DNS para resolver todos os registros (também conhecido como consulta ANY ou *). O argumento ret passado para a função callback será um array contendo vários tipos de registros. Cada objeto tem uma propriedade type que indica o tipo do registro atual. E dependendo do type, propriedades adicionais estarão presentes no objeto:

TipoPropriedades
'A'address / ttl
'AAAA'address / ttl
'CNAME'value
'MX'Consulte dns.resolveMx()
'NAPTR'Consulte dns.resolveNaptr()
'NS'value
'PTR'value
'SOA'Consulte dns.resolveSoa()
'SRV'Consulte dns.resolveSrv()
'TXT'Este tipo de registro contém uma propriedade de array chamada entries que se refere a dns.resolveTxt(), por exemplo, { entries: ['...'], type: 'TXT' }

Aqui está um exemplo do objeto ret passado para o callback:

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

Os operadores de servidor DNS podem optar por não responder a consultas ANY. Pode ser melhor chamar métodos individuais como dns.resolve4(), dns.resolveMx() e assim por diante. Para mais detalhes, consulte RFC 8482.

dns.resolveCname(hostname, callback)

[Histórico]

VersãoMudanças
v18.0.0Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK.
v0.3.2Adicionado em: v0.3.2

Usa o protocolo DNS para resolver registros CNAME para o hostname. O argumento addresses passado para a função callback conterá um array de registros de nome canônico disponíveis para o hostname (por exemplo, ['bar.example.com']).

dns.resolveCaa(hostname, callback)

[Histórico]

VersãoMudanças
v18.0.0Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK.
v15.0.0, v14.17.0Adicionado em: v15.0.0, v14.17.0

Usa o protocolo DNS para resolver registros CAA para o hostname. O argumento addresses passado para a função callback conterá um array de registros de autorização de autoridade de certificação disponíveis para o hostname (por exemplo, [{critical: 0, iodef: 'mailto:[email protected]'}, {critical: 128, issue: 'pki.example.com'}]).

dns.resolveMx(hostname, callback)

[Histórico]

VersãoMudanças
v18.0.0Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK.
v0.1.27Adicionado em: v0.1.27

Utiliza o protocolo DNS para resolver registros de troca de e-mail (registros MX) para o hostname. O argumento addresses passado para a função callback conterá um array de objetos contendo tanto uma propriedade priority quanto uma propriedade exchange (por exemplo, [{priority: 10, exchange: 'mx.example.com'}, ...]).

dns.resolveNaptr(hostname, callback)

[Histórico]

VersãoMudanças
v18.0.0Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK.
v0.9.12Adicionado em: v0.9.12

Utiliza o protocolo DNS para resolver registros baseados em expressões regulares (registros NAPTR) para o hostname. O argumento addresses passado para a função callback conterá um array de objetos com as seguintes propriedades:

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

[Histórico]

VersãoMudanças
v18.0.0Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK.
v0.1.90Adicionado em: v0.1.90

Usa o protocolo DNS para resolver registros de servidor de nomes (registros NS) para o hostname. O argumento addresses passado para a função callback conterá um array de registros de servidor de nomes disponíveis para hostname (por exemplo, ['ns1.example.com', 'ns2.example.com']).

dns.resolvePtr(hostname, callback)

[Histórico]

VersãoMudanças
v18.0.0Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK.
v6.0.0Adicionado em: v6.0.0

Usa o protocolo DNS para resolver registros de ponteiro (registros PTR) para o hostname. O argumento addresses passado para a função callback será um array de strings contendo os registros de resposta.

dns.resolveSoa(hostname, callback)

[Histórico]

VersãoMudanças
v18.0.0Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK.
v0.11.10Adicionado em: v0.11.10

Usa o protocolo DNS para resolver um registro de início de autoridade (registro SOA) para o hostname. O argumento address passado para a função callback será um objeto com as seguintes propriedades:

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

[Histórico]

VersãoMudanças
v18.0.0Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK.
v0.1.27Adicionado em: v0.1.27

Usa o protocolo DNS para resolver registros de serviço (registros SRV) para o hostname. O argumento addresses passado para a função callback será um array de objetos com as seguintes propriedades:

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

dns.resolveTxt(hostname, callback)

[Histórico]

VersãoMudanças
v18.0.0Passar um callback inválido para o argumento callback agora lança ERR_INVALID_ARG_TYPE em vez de ERR_INVALID_CALLBACK.
v0.1.27Adicionado em: v0.1.27

Usa o protocolo DNS para resolver consultas de texto (registros TXT) para o hostname. O argumento records passado para a função callback é um array bidimensional dos registros de texto disponíveis para hostname (por exemplo, [ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]). Cada sub-array contém chunks TXT de um registro. Dependendo do caso de uso, eles podem ser unidos ou tratados separadamente.

dns.reverse(ip, callback)

Adicionado em: v0.1.16

Realiza uma consulta DNS reversa que resolve um endereço IPv4 ou IPv6 para um array de nomes de host.

Em caso de erro, err é um objeto Error, onde err.code é um dos códigos de erro DNS.

dns.setDefaultResultOrder(order)

[Histórico]

VersãoMudanças
v22.1.0, v20.13.0O valor ipv6first agora é suportado.
v17.0.0Valor padrão alterado para verbatim.
v16.4.0, v14.18.0Adicionado em: v16.4.0, v14.18.0
  • order <string> deve ser 'ipv4first', 'ipv6first' ou 'verbatim'.

Define o valor padrão de order em dns.lookup() e dnsPromises.lookup(). O valor pode ser:

  • ipv4first: define o order padrão para ipv4first.
  • ipv6first: define o order padrão para ipv6first.
  • verbatim: define o order padrão para verbatim.

O padrão é verbatim e dns.setDefaultResultOrder() tem maior prioridade do que --dns-result-order. Ao usar threads de trabalho, dns.setDefaultResultOrder() da thread principal não afetará as ordens DNS padrão nos workers.

dns.getDefaultResultOrder()

[Histórico]

VersãoMudanças
v22.1.0, v20.13.0O valor ipv6first agora é suportado.
v20.1.0, v18.17.0Adicionado em: v20.1.0, v18.17.0

Obtém o valor padrão para order em dns.lookup() e dnsPromises.lookup(). O valor pode ser:

  • ipv4first: para order com padrão para ipv4first.
  • ipv6first: para order com padrão para ipv6first.
  • verbatim: para order com padrão para verbatim.

dns.setServers(servers)

Adicionado em: v0.11.3

Define o endereço IP e a porta dos servidores a serem usados ao executar a resolução de DNS. O argumento servers é um array de endereços formatados RFC 5952. Se a porta for a porta DNS padrão IANA (53), ela pode ser omitida.

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

Um erro será lançado se um endereço inválido for fornecido.

O método dns.setServers() não deve ser chamado enquanto uma consulta DNS estiver em andamento.

O método dns.setServers() afeta apenas dns.resolve(), dns.resolve*() e dns.reverse() (e especificamente não dns.lookup()).

Este método funciona de forma muito semelhante ao resolve.conf. Ou seja, se a tentativa de resolução com o primeiro servidor fornecido resultar em um erro NOTFOUND, o método resolve() não tentará resolver com os servidores subsequentes fornecidos. Os servidores DNS de fallback só serão usados se os anteriores expirarem ou resultarem em algum outro erro.

API de promessas DNS

[Histórico]

VersãoAlterações
v15.0.0Exposto como require('dns/promises').
v11.14.0, v10.17.0Esta API não é mais experimental.
v10.6.0Adicionado em: v10.6.0

A API dns.promises fornece um conjunto alternativo de métodos DNS assíncronos que retornam objetos Promise em vez de usar callbacks. A API está acessível via require('node:dns').promises ou require('node:dns/promises').

Classe: dnsPromises.Resolver

Adicionado em: v10.6.0

Um resolvedor independente para requisições DNS.

A criação de um novo resolvedor usa as configurações de servidor padrão. Definir os servidores usados para um resolvedor usando resolver.setServers() não afeta outros resolvedores:

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

// Esta requisição usará o servidor em 4.4.4.4, independente das configurações globais.
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 requisição usará o servidor em 4.4.4.4, independente das configurações globais.
resolver.resolve4('example.org').then(addresses => {
  // ...
})

// Alternativamente, o mesmo código pode ser escrito usando o estilo async-await.
;(async function () {
  const addresses = await resolver.resolve4('example.org')
})()

Os seguintes métodos da API dnsPromises estão disponíveis:

resolver.cancel()

Adicionado em: v15.3.0, v14.17.0

Cancela todas as consultas DNS pendentes feitas por este resolvedor. As promises correspondentes serão rejeitadas com um erro com o código ECANCELLED.

dnsPromises.getServers()

Adicionado em: v10.6.0

Retorna um array de strings de endereço IP, formatadas de acordo com RFC 5952, que estão atualmente configuradas para resolução de DNS. Uma string incluirá uma seção de porta se uma porta personalizada for usada.

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

dnsPromises.lookup(hostname[, options])

[Histórico]

VersãoAlterações
v22.1.0, v20.13.0A opção verbatim agora está obsoleta em favor da nova opção order.
v10.6.0Adicionado em: v10.6.0
  • hostname <string>
  • options <integer> | <Object>
    • family <integer> A família do registro. Deve ser 4, 6 ou 0. O valor 0 indica que um endereço IPv4 ou IPv6 é retornado. Se o valor 0 for usado com { all: true } (veja abaixo), um ou ambos os endereços IPv4 e IPv6 são retornados, dependendo do resolvedor DNS do sistema. Padrão: 0.
    • hints <number> Uma ou mais flags getaddrinfo suportadas. Várias flags podem ser passadas por meio de OR bit a bit de seus valores.
    • all <boolean> Quando true, a Promise é resolvida com todos os endereços em um array. Caso contrário, retorna um único endereço. Padrão: false.
    • order <string> Quando verbatim, a Promise é resolvida com endereços IPv4 e IPv6 na ordem em que o resolvedor DNS os retornou. Quando ipv4first, os endereços IPv4 são colocados antes dos endereços IPv6. Quando ipv6first, os endereços IPv6 são colocados antes dos endereços IPv4. Padrão: verbatim (os endereços não são reordenados). O valor padrão é configurável usando dns.setDefaultResultOrder() ou --dns-result-order. O novo código deve usar { order: 'verbatim' }.
    • verbatim <boolean> Quando true, a Promise é resolvida com endereços IPv4 e IPv6 na ordem em que o resolvedor DNS os retornou. Quando false, os endereços IPv4 são colocados antes dos endereços IPv6. Esta opção será depreciada em favor de order. Quando ambos são especificados, order tem maior precedência. O novo código deve usar apenas order. Padrão: atualmente false (os endereços são reordenados), mas espera-se que isso mude em um futuro não muito distante. O valor padrão é configurável usando dns.setDefaultResultOrder() ou --dns-result-order.

Resolve um nome de host (por exemplo, 'nodejs.org') no primeiro registro A (IPv4) ou AAAA (IPv6) encontrado. Todas as propriedades option são opcionais. Se options for um inteiro, então deve ser 4 ou 6 – se options não for fornecido, então endereços IPv4 ou IPv6, ou ambos, serão retornados se encontrados.

Com a opção all definida como true, a Promise é resolvida com addresses sendo um array de objetos com as propriedades address e family.

Em caso de erro, a Promise é rejeitada com um objeto Error, onde err.code é o código de erro. Tenha em mente que err.code será definido como 'ENOTFOUND' não apenas quando o nome do host não existir, mas também quando a pesquisa falhar de outras maneiras, como nenhum descritor de arquivo disponível.

dnsPromises.lookup() não tem necessariamente nada a ver com o protocolo DNS. A implementação usa um recurso do sistema operacional que pode associar nomes a endereços e vice-versa. Esta implementação pode ter consequências sutis, mas importantes, no comportamento de qualquer programa Node.js. Por favor, reserve algum tempo para consultar a seção de considerações sobre a implementação antes de usar dnsPromises.lookup().

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

// Quando options.all é true, o resultado será um 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
})

// Quando options.all é true, o resultado será um 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)

Adicionado em: v10.6.0

Resolve o address e a port fornecidos em um nome de host e serviço usando a implementação getnameinfo subjacente do sistema operacional.

Se address não for um endereço IP válido, um TypeError será lançado. O port será convertido em um número. Se não for uma porta legal, um TypeError será lançado.

Em caso de erro, a Promise é rejeitada com um objeto Error, onde err.code é o código de erro.

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

Adicionado em: v10.6.0

  • hostname <string> Nome do host a ser resolvido.
  • rrtype <string> Tipo de registro de recurso. Padrão: 'A'.

Usa o protocolo DNS para resolver um nome de host (por exemplo, 'nodejs.org') em um array dos registros de recursos. Quando bem-sucedido, a Promise é resolvida com um array de registros de recursos. O tipo e a estrutura dos resultados individuais variam com base em rrtype:

rrtyperecords contémTipo de resultadoMétodo abreviado
'A'endereços IPv4 (padrão)<string>dnsPromises.resolve4()
'AAAA'endereços IPv6<string>dnsPromises.resolve6()
'ANY'quaisquer registros<Object>dnsPromises.resolveAny()
'CAA'registros de autorização CA<Object>dnsPromises.resolveCaa()
'CNAME'registros de nome canônico<string>dnsPromises.resolveCname()
'MX'registros de troca de e-mail<Object>dnsPromises.resolveMx()
'NAPTR'registros de ponteiro de autoridade de nome<Object>dnsPromises.resolveNaptr()
'NS'registros de servidor de nomes<string>dnsPromises.resolveNs()
'PTR'registros de ponteiro<string>dnsPromises.resolvePtr()
'SOA'registros de início de autoridade<Object>dnsPromises.resolveSoa()
'SRV'registros de serviço<Object>dnsPromises.resolveSrv()
'TXT'registros de texto<string[]>dnsPromises.resolveTxt()

Em caso de erro, a Promise é rejeitada com um objeto Error, onde err.code é um dos códigos de erro DNS.

dnsPromises.resolve4(hostname[, options])

Adicionado em: v10.6.0

  • hostname <string> Nome do host a ser resolvido.
  • options <Object>
    • ttl <boolean> Recupera o valor de Time-To-Live (TTL) de cada registro. Quando true, a Promise é resolvida com um array de objetos { address: '1.2.3.4', ttl: 60 } em vez de um array de strings, com o TTL expresso em segundos.

Utiliza o protocolo DNS para resolver endereços IPv4 (registros A) para o hostname. Em caso de sucesso, a Promise é resolvida com um array de endereços IPv4 (por exemplo, ['74.125.79.104', '74.125.79.105', '74.125.79.106']).

dnsPromises.resolve6(hostname[, options])

Adicionado em: v10.6.0

  • hostname <string> Nome do host a ser resolvido.
  • options <Object>
    • ttl <boolean> Recupera o valor de Time-To-Live (TTL) de cada registro. Quando true, a Promise é resolvida com um array de objetos { address: '0:1:2:3:4:5:6:7', ttl: 60 } em vez de um array de strings, com o TTL expresso em segundos.

Utiliza o protocolo DNS para resolver endereços IPv6 (registros AAAA) para o hostname. Em caso de sucesso, a Promise é resolvida com um array de endereços IPv6.

dnsPromises.resolveAny(hostname)

Adicionado em: v10.6.0

Utiliza o protocolo DNS para resolver todos os registros (também conhecido como consulta ANY ou *). Em caso de sucesso, a Promise é resolvida com um array contendo vários tipos de registros. Cada objeto tem uma propriedade type que indica o tipo do registro atual. E dependendo do type, propriedades adicionais estarão presentes no objeto:

TipoPropriedades
'A'address / ttl
'AAAA'address / ttl
'CNAME'value
'MX'Consulte dnsPromises.resolveMx()
'NAPTR'Consulte dnsPromises.resolveNaptr()
'NS'value
'PTR'value
'SOA'Consulte dnsPromises.resolveSoa()
'SRV'Consulte dnsPromises.resolveSrv()
'TXT'Este tipo de registro contém uma propriedade de array chamada entries que se refere a dnsPromises.resolveTxt(), por exemplo, { entries: ['...'], type: 'TXT' }

Aqui está um exemplo do objeto de 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)

Adicionado em: v15.0.0, v14.17.0

Usa o protocolo DNS para resolver registros CAA para o hostname. Em caso de sucesso, a Promise é resolvida com um array de objetos contendo registros de autorização de autoridades de certificação disponíveis para o hostname (por exemplo, [{critical: 0, iodef: 'mailto:[email protected]'},{critical: 128, issue: 'pki.example.com'}]).

dnsPromises.resolveCname(hostname)

Adicionado em: v10.6.0

Usa o protocolo DNS para resolver registros CNAME para o hostname. Em caso de sucesso, a Promise é resolvida com um array de registros de nome canônico disponíveis para o hostname (por exemplo, ['bar.example.com']).

dnsPromises.resolveMx(hostname)

Adicionado em: v10.6.0

Usa o protocolo DNS para resolver registros de troca de e-mail (registros MX) para o hostname. Em caso de sucesso, a Promise é resolvida com um array de objetos contendo uma propriedade priority e exchange (por exemplo, [{priority: 10, exchange: 'mx.example.com'}, ...]).

dnsPromises.resolveNaptr(hostname)

Adicionado em: v10.6.0

Usa o protocolo DNS para resolver registros baseados em expressões regulares (registros NAPTR) para o hostname. Em caso de sucesso, a Promise é resolvida com um array de objetos com as seguintes propriedades:

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

Adicionado em: v10.6.0

Usa o protocolo DNS para resolver registros de servidor de nomes (registros NS) para o hostname. Em caso de sucesso, a Promise é resolvida com um array de registros de servidor de nomes disponíveis para hostname (por exemplo, ['ns1.example.com', 'ns2.example.com']).

dnsPromises.resolvePtr(hostname)

Adicionado em: v10.6.0

Usa o protocolo DNS para resolver registros de ponteiro (registros PTR) para o hostname. Em caso de sucesso, a Promise é resolvida com um array de strings contendo os registros de resposta.

dnsPromises.resolveSoa(hostname)

Adicionado em: v10.6.0

Usa o protocolo DNS para resolver um registro de início de autoridade (registro SOA) para o hostname. Em caso de sucesso, a Promise é resolvida com um objeto com as seguintes propriedades:

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

Adicionado em: v10.6.0

Usa o protocolo DNS para resolver registros de serviço (registros SRV) para o hostname. Em caso de sucesso, a Promise é resolvida com um array de objetos com as seguintes propriedades:

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

dnsPromises.resolveTxt(hostname)

Adicionado em: v10.6.0

Usa o protocolo DNS para resolver consultas de texto (registros TXT) para o hostname. Em caso de sucesso, a Promise é resolvida com um array bidimensional dos registros de texto disponíveis para hostname (por exemplo, [ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]). Cada sub-array contém partes TXT de um registro. Dependendo do caso de uso, estes podem ser unidos ou tratados separadamente.

dnsPromises.reverse(ip)

Adicionado em: v10.6.0

Executa uma consulta DNS reversa que resolve um endereço IPv4 ou IPv6 para um array de nomes de host.

Em caso de erro, a Promise é rejeitada com um objeto Error, onde err.code é um dos códigos de erro DNS.

dnsPromises.setDefaultResultOrder(order)

[Histórico]

VersãoMudanças
v22.1.0, v20.13.0O valor ipv6first agora é suportado.
v17.0.0Alterado o valor padrão para verbatim.
v16.4.0, v14.18.0Adicionado em: v16.4.0, v14.18.0
  • order <string> deve ser 'ipv4first', 'ipv6first' ou 'verbatim'.

Define o valor padrão de order em dns.lookup() e dnsPromises.lookup(). O valor pode ser:

  • ipv4first: define o order padrão para ipv4first.
  • ipv6first: define o order padrão para ipv6first.
  • verbatim: define o order padrão para verbatim.

O padrão é verbatim e dnsPromises.setDefaultResultOrder() tem maior prioridade do que --dns-result-order. Ao usar threads de trabalho, dnsPromises.setDefaultResultOrder() da thread principal não afetará as ordens dns padrão nos workers.

dnsPromises.getDefaultResultOrder()

Adicionado em: v20.1.0, v18.17.0

Obtém o valor de dnsOrder.

dnsPromises.setServers(servers)

Adicionado em: v10.6.0

Define o endereço IP e a porta dos servidores a serem usados ao executar a resolução de DNS. O argumento servers é um array de endereços formatados RFC 5952. Se a porta for a porta DNS padrão IANA (53), ela pode ser omitida.

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

Um erro será lançado se um endereço inválido for fornecido.

O método dnsPromises.setServers() não deve ser chamado enquanto uma consulta DNS estiver em andamento.

Este método funciona de forma muito semelhante ao resolve.conf. Ou seja, se a tentativa de resolver com o primeiro servidor fornecido resultar em um erro NOTFOUND, o método resolve() não tentará resolver com servidores subsequentes fornecidos. Os servidores DNS de fallback só serão usados se os anteriores expirarem ou resultarem em algum outro erro.

Códigos de Erro

Cada consulta DNS pode retornar um dos seguintes códigos de erro:

  • dns.NODATA: O servidor DNS retornou uma resposta sem dados.
  • dns.FORMERR: O servidor DNS afirma que a consulta estava malformada.
  • dns.SERVFAIL: O servidor DNS retornou uma falha geral.
  • dns.NOTFOUND: Nome de domínio não encontrado.
  • dns.NOTIMP: O servidor DNS não implementa a operação solicitada.
  • dns.REFUSED: O servidor DNS recusou a consulta.
  • dns.BADQUERY: Consulta DNS malformada.
  • dns.BADNAME: Nome de host malformado.
  • dns.BADFAMILY: Família de endereços não suportada.
  • dns.BADRESP: Resposta DNS malformada.
  • dns.CONNREFUSED: Não foi possível contactar os servidores DNS.
  • dns.TIMEOUT: Tempo limite ao contactar os servidores DNS.
  • dns.EOF: Fim do arquivo.
  • dns.FILE: Erro ao ler o arquivo.
  • dns.NOMEM: Sem memória.
  • dns.DESTRUCTION: O canal está sendo destruído.
  • dns.BADSTR: String malformada.
  • dns.BADFLAGS: Flags ilegais especificadas.
  • dns.NONAME: O nome de host fornecido não é numérico.
  • dns.BADHINTS: Flags de dicas ilegais especificadas.
  • dns.NOTINITIALIZED: Inicialização da biblioteca c-ares ainda não realizada.
  • dns.LOADIPHLPAPI: Erro ao carregar iphlpapi.dll.
  • dns.ADDRGETNETWORKPARAMS: Não foi possível encontrar a função GetNetworkParams.
  • dns.CANCELLED: Consulta DNS cancelada.

A API dnsPromises também exporta os códigos de erro acima, por exemplo, dnsPromises.NODATA.

Considerações de Implementação

Embora dns.lookup() e as várias funções dns.resolve*()/dns.reverse() tenham o mesmo objetivo de associar um nome de rede a um endereço de rede (ou vice-versa), seu comportamento é bastante diferente. Essas diferenças podem ter consequências sutis, mas significativas, no comportamento dos programas Node.js.

dns.lookup()

Internamente, dns.lookup() usa as mesmas facilidades do sistema operacional que a maioria dos outros programas. Por exemplo, dns.lookup() quase sempre resolverá um determinado nome da mesma forma que o comando ping. Na maioria dos sistemas operacionais semelhantes ao POSIX, o comportamento da função dns.lookup() pode ser modificado alterando as configurações em nsswitch.conf(5) e/ou resolv.conf(5), mas alterar esses arquivos mudará o comportamento de todos os outros programas em execução no mesmo sistema operacional.

Embora a chamada para dns.lookup() seja assíncrona da perspectiva do JavaScript, ela é implementada como uma chamada síncrona para getaddrinfo(3) que é executada no pool de threads do libuv. Isso pode ter implicações negativas surpreendentes de desempenho para algumas aplicações, consulte a documentação UV_THREADPOOL_SIZE para mais informações.

Várias APIs de rede chamarão dns.lookup() internamente para resolver nomes de host. Se isso for um problema, considere resolver o nome do host para um endereço usando dns.resolve() e usando o endereço em vez de um nome de host. Além disso, algumas APIs de rede (como socket.connect() e dgram.createSocket()) permitem que o resolvedor padrão, dns.lookup(), seja substituído.

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

Estas funções são implementadas de forma bem diferente de dns.lookup(). Elas não usam getaddrinfo(3) e sempre realizam uma consulta DNS na rede. Esta comunicação de rede é sempre feita de forma assíncrona e não usa o threadpool do libuv.

Como resultado, estas funções não podem ter o mesmo impacto negativo em outros processamentos que acontecem no threadpool do libuv que dns.lookup() pode ter.

Elas não usam o mesmo conjunto de arquivos de configuração que dns.lookup() usa. Por exemplo, elas não usam a configuração de /etc/hosts.