Skip to content

DNS

[Stable: 2 - Stable]

Stable: 2 Stability: 2 - Stable

소스 코드: lib/dns.js

node:dns 모듈은 이름 확인을 가능하게 합니다. 예를 들어, 호스트 이름의 IP 주소를 조회하는 데 사용합니다.

도메인 이름 시스템(DNS)으로 명명되었지만, 항상 조회에 DNS 프로토콜을 사용하는 것은 아닙니다. dns.lookup()은 운영 체제 기능을 사용하여 이름 확인을 수행합니다. 네트워크 통신을 수행할 필요가 없을 수도 있습니다. 동일한 시스템의 다른 애플리케이션이 수행하는 방식으로 이름 확인을 수행하려면 dns.lookup()을 사용합니다.

js
import dns from 'node:dns'

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

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

node:dns 모듈의 다른 모든 함수는 실제 DNS 서버에 연결하여 이름 확인을 수행합니다. 항상 네트워크를 사용하여 DNS 쿼리를 수행합니다. 이러한 함수는 dns.lookup()에서 사용하는 것과 동일한 구성 파일 집합(예: /etc/hosts)을 사용하지 않습니다. 다른 이름 확인 기능을 우회하여 항상 DNS 쿼리를 수행하려면 이러한 함수를 사용합니다.

js
import dns from 'node:dns'

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

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

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

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

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

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

자세한 내용은 구현 고려 사항 섹션을 참조하십시오.

클래스: dns.Resolver

추가됨: v8.3.0

DNS 요청을 위한 독립적인 resolver입니다.

새로운 resolver를 생성하면 기본 서버 설정이 사용됩니다. resolver.setServers()를 사용하여 resolver에 사용되는 서버를 설정해도 다른 resolver에는 영향을 미치지 않습니다.

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

// 이 요청은 전역 설정과 관계없이 4.4.4.4 서버를 사용합니다.
resolver.resolve4('example.org', (err, addresses) => {
  // ...
})
js
const { Resolver } = require('node:dns')
const resolver = new Resolver()
resolver.setServers(['4.4.4.4'])

// 이 요청은 전역 설정과 관계없이 4.4.4.4 서버를 사용합니다.
resolver.resolve4('example.org', (err, addresses) => {
  // ...
})

다음 node:dns 모듈의 메서드를 사용할 수 있습니다.

Resolver([options])

[History]

버전변경 사항
v16.7.0, v14.18.0options 객체가 이제 tries 옵션을 허용합니다.
v12.18.3생성자가 이제 options 객체를 허용합니다. 단일 지원 옵션은 timeout입니다.
v8.3.0추가됨: v8.3.0

새로운 resolver를 생성합니다.

  • options <Object>
    • timeout <integer> 밀리초 단위의 쿼리 제한 시간 또는 기본 제한 시간을 사용하려면 -1.
    • tries <integer> 포기하기 전에 resolver가 각 이름 서버에 연결을 시도하는 횟수입니다. 기본값: 4

resolver.cancel()

추가됨: v8.3.0

이 resolver가 수행한 모든 미결 DNS 쿼리를 취소합니다. 해당 콜백은 ECANCELLED 코드의 오류와 함께 호출됩니다.

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

추가됨: v15.1.0, v14.17.0

  • ipv4 <string> IPv4 주소의 문자열 표현. 기본값: '0.0.0.0'
  • ipv6 <string> IPv6 주소의 문자열 표현. 기본값: '::0'

resolver 인스턴스는 지정된 IP 주소에서 요청을 보냅니다. 이를 통해 다중 호밍 시스템에서 사용될 때 아웃바운드 인터페이스를 지정할 수 있습니다.

v4 또는 v6 주소가 지정되지 않으면 기본값으로 설정되고 운영 체제가 자동으로 로컬 주소를 선택합니다.

resolver는 IPv4 DNS 서버에 요청을 할 때 v4 로컬 주소를 사용하고, IPv6 DNS 서버에 요청을 할 때 v6 로컬 주소를 사용합니다. 해석 요청의 rrtype은 사용되는 로컬 주소에 영향을 미치지 않습니다.

dns.getServers()

추가됨: v0.11.3

현재 DNS 확인에 대해 구성된 IP 주소 문자열의 배열을 반환합니다. RFC 5952에 따라 형식이 지정됩니다. 사용자 지정 포트가 사용되는 경우 문자열에 포트 섹션이 포함됩니다.

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

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

[히스토리]

버전변경 사항
v22.1.0, v20.13.0verbatim 옵션이 새로운 order 옵션으로 대체되어 더 이상 사용되지 않습니다.
v18.4.0node:net과의 호환성을 위해 옵션 객체를 전달할 때 family 옵션은 문자열 'IPv4' 또는 문자열 'IPv6'일 수 있습니다.
v18.0.0callback 인수에 잘못된 콜백을 전달하면 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE가 throw됩니다.
v17.0.0verbatim 옵션의 기본값이 이제 true입니다.
v8.5.0verbatim 옵션이 지원됩니다.
v1.2.0all 옵션이 지원됩니다.
v0.1.90추가됨: v0.1.90
  • hostname <string>

  • options <integer> | <Object>

    • family <integer> | <string> 레코드 패밀리. 4, 6 또는 0이어야 합니다. 하위 호환성을 위해 'IPv4''IPv6'는 각각 46으로 해석됩니다. 값 0은 IPv4 또는 IPv6 주소 중 하나 또는 둘 다 반환됨을 나타냅니다. 값 0{ all: true } (아래 참조)와 함께 사용하면 시스템의 DNS resolver에 따라 IPv4 및 IPv6 주소 중 하나 또는 둘 다 반환됩니다. 기본값: 0.
    • hints <number> 지원되는 getaddrinfo 플래그 중 하나 이상. 비트별 OR 연산을 통해 여러 플래그를 전달할 수 있습니다.
    • all <boolean> true이면 콜백은 해석된 모든 주소를 배열로 반환합니다. 그렇지 않으면 단일 주소를 반환합니다. 기본값: false.
    • order <string> verbatim인 경우 해석된 주소는 정렬되지 않고 반환됩니다. ipv4first인 경우 해석된 주소는 IPv4 주소를 IPv6 주소 앞에 배치하여 정렬됩니다. ipv6first인 경우 해석된 주소는 IPv6 주소를 IPv4 주소 앞에 배치하여 정렬됩니다. 기본값: verbatim (주소가 재정렬되지 않음). 기본값은 dns.setDefaultResultOrder() 또는 --dns-result-order를 사용하여 구성할 수 있습니다.
    • verbatim <boolean> true이면 콜백은 DNS resolver가 반환한 순서대로 IPv4 및 IPv6 주소를 수신합니다. false이면 IPv4 주소가 IPv6 주소 앞에 배치됩니다. 이 옵션은 order로 대체되어 더 이상 사용되지 않습니다. 둘 다 지정된 경우 order가 우선합니다. 새로운 코드는 order만 사용해야 합니다. 기본값: true (주소가 재정렬되지 않음). 기본값은 dns.setDefaultResultOrder() 또는 --dns-result-order를 사용하여 구성할 수 있습니다.
  • callback <Function>

    • err <Error>
    • address <string> IPv4 또는 IPv6 주소의 문자열 표현.
    • family <integer> address의 패밀리를 나타내는 4 또는 6, 또는 주소가 IPv4 또는 IPv6 주소가 아닌 경우 0. 0은 운영 체제에서 사용하는 이름 확인 서비스의 버그를 나타낼 가능성이 높습니다.

호스트 이름(예: 'nodejs.org')을 처음 발견된 A(IPv4) 또는 AAAA(IPv6) 레코드로 확인합니다. 모든 option 속성은 선택 사항입니다. options가 정수이면 4 또는 6이어야 합니다. options가 제공되지 않으면 발견된 경우 IPv4 또는 IPv6 주소 또는 둘 다 반환됩니다.

all 옵션이 true로 설정되면 callback의 인수는 (err, addresses)로 변경되며, addressesaddressfamily 속성을 가진 객체의 배열입니다.

오류 발생 시 errError 객체이며, err.code는 오류 코드입니다. err.code는 호스트 이름이 존재하지 않는 경우뿐만 아니라 사용 가능한 파일 디스크립터가 없는 등 다른 방식으로 조회가 실패하는 경우에도 'ENOTFOUND'로 설정됩니다.

dns.lookup()은 반드시 DNS 프로토콜과 관련이 있는 것은 아닙니다. 구현은 이름과 주소를 서로 연결할 수 있는 운영 체제 기능을 사용합니다. 이 구현은 모든 Node.js 프로그램의 동작에 미묘하지만 중요한 영향을 미칠 수 있습니다. dns.lookup()을 사용하기 전에 구현 고려 사항 섹션을 참조하십시오.

사용 예:

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

// options.all이 true이면 결과는 배열이 됩니다.
options.all = true
dns.lookup('example.org', options, (err, addresses) => console.log('addresses: %j', addresses))
// addresses: [{"address":"2606:2800:21f:cb07:6820:80da:af6b:8b2c","family":6}]
js
const dns = require('node:dns')
const options = {
  family: 6,
  hints: dns.ADDRCONFIG | dns.V4MAPPED,
}
dns.lookup('example.org', options, (err, address, family) => console.log('address: %j family: IPv%s', address, family))
// address: "2606:2800:21f:cb07:6820:80da:af6b:8b2c" family: IPv6

// options.all이 true이면 결과는 배열이 됩니다.
options.all = true
dns.lookup('example.org', options, (err, addresses) => console.log('addresses: %j', addresses))
// addresses: [{"address":"2606:2800:21f:cb07:6820:80da:af6b:8b2c","family":6}]

이 메서드가 util.promisify()된 버전으로 호출되고 alltrue로 설정되지 않은 경우 addressfamily 속성을 가진 Object에 대한 Promise를 반환합니다.

지원되는 getaddrinfo 플래그

[히스토리]

버전변경 사항
v13.13.0, v12.17.0dns.ALL 플래그 지원 추가

다음 플래그는 dns.lookup()에 대한 힌트로 전달될 수 있습니다.

  • dns.ADDRCONFIG: 반환되는 주소 유형을 시스템에 구성된 비 루프백 주소 유형으로 제한합니다. 예를 들어, 현재 시스템에 IPv4 주소가 하나 이상 구성되어 있는 경우에만 IPv4 주소가 반환됩니다.
  • dns.V4MAPPED: IPv6 패밀리가 지정되었지만 IPv6 주소가 발견되지 않은 경우 IPv4 매핑된 IPv6 주소를 반환합니다. 일부 운영 체제(예: FreeBSD 10.1)에서는 지원되지 않습니다.
  • dns.ALL: dns.V4MAPPED가 지정된 경우, IPv4 매핑된 IPv6 주소뿐만 아니라 확인된 IPv6 주소도 반환합니다.

dns.lookupService(address, port, callback)

[히스토리]

버전변경 사항
v18.0.0callback 인수에 잘못된 콜백을 전달하면 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE가 throw됩니다.
v0.11.14추가됨: v0.11.14

운영 체제의 기본 getnameinfo 구현을 사용하여 지정된 addressport를 호스트 이름과 서비스로 확인합니다.

address가 유효한 IP 주소가 아닌 경우 TypeError가 throw됩니다. port는 숫자로 강제 변환됩니다. 유효한 포트가 아닌 경우 TypeError가 throw됩니다.

오류 발생 시 errError 객체이며, err.code는 오류 코드입니다.

js
import dns from 'node:dns'
dns.lookupService('127.0.0.1', 22, (err, hostname, service) => {
  console.log(hostname, service)
  // 출력: localhost ssh
})
js
const dns = require('node:dns')
dns.lookupService('127.0.0.1', 22, (err, hostname, service) => {
  console.log(hostname, service)
  // 출력: localhost ssh
})

이 메서드가 util.promisify()된 버전으로 호출되는 경우, hostnameservice 속성을 가진 Object에 대한 Promise를 반환합니다.

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

[히스토리]

버전변경 사항
v18.0.0callback 인수에 잘못된 콜백을 전달하면 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE를 throw합니다.
v0.1.27추가됨: v0.1.27

DNS 프로토콜을 사용하여 호스트 이름(예: 'nodejs.org')을 리소스 레코드 배열로 확인합니다. callback 함수는 (err, records) 인수를 갖습니다. 성공하면 records는 리소스 레코드의 배열이 됩니다. 개별 결과의 유형과 구조는 rrtype에 따라 다릅니다.

rrtyperecords 포함 내용결과 유형약식 메서드
'A'IPv4 주소 (기본값)<string>dns.resolve4()
'AAAA'IPv6 주소<string>dns.resolve6()
'ANY'모든 레코드<Object>dns.resolveAny()
'CAA'CA 권한 레코드<Object>dns.resolveCaa()
'CNAME'정규 이름 레코드<string>dns.resolveCname()
'MX'메일 교환 레코드<Object>dns.resolveMx()
'NAPTR'이름 권한 포인터 레코드<Object>dns.resolveNaptr()
'NS'이름 서버 레코드<string>dns.resolveNs()
'PTR'포인터 레코드<string>dns.resolvePtr()
'SOA'권한 시작 레코드<Object>dns.resolveSoa()
'SRV'서비스 레코드<Object>dns.resolveSrv()
'TXT'텍스트 레코드<string[]>dns.resolveTxt()

오류 발생 시 errError 객체이며, err.codeDNS 오류 코드 중 하나입니다.

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

[History]

버전변경 사항
v18.0.0callback 인수에 잘못된 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE를 throw합니다.
v7.2.0이 메서드는 이제 options, 특히 options.ttl을 전달하는 것을 지원합니다.
v0.1.16추가됨: v0.1.16
  • hostname <string> 확인할 호스트 이름.

  • options <Object>

    • ttl <boolean> 각 레코드의 Time-To-Live 값(TTL)을 검색합니다. true이면 콜백은 문자열 배열 대신 { address: '1.2.3.4', ttl: 60 } 객체의 배열을 받으며, TTL은 초 단위로 표시됩니다.
  • callback <Function>

DNS 프로토콜을 사용하여 hostname에 대한 IPv4 주소(A 레코드)를 확인합니다. callback 함수에 전달되는 addresses 인수에는 IPv4 주소의 배열(예: ['74.125.79.104', '74.125.79.105', '74.125.79.106'])이 포함됩니다.

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

[History]

버전변경 사항
v18.0.0callback 인수에 잘못된 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE를 throw합니다.
v7.2.0이 메서드는 이제 options, 특히 options.ttl을 전달하는 것을 지원합니다.
v0.1.16추가됨: v0.1.16
  • hostname <string> 확인할 호스트 이름.

  • options <Object>

    • ttl <boolean> 각 레코드의 Time-To-Live 값(TTL)을 검색합니다. true이면 콜백은 문자열 배열 대신 { address: '0:1:2:3:4:5:6:7', ttl: 60 } 객체의 배열을 받으며, TTL은 초 단위로 표시됩니다.
  • callback <Function>

DNS 프로토콜을 사용하여 hostname에 대한 IPv6 주소(AAAA 레코드)를 확인합니다. callback 함수에 전달되는 addresses 인수에는 IPv6 주소의 배열이 포함됩니다.

dns.resolveAny(hostname, callback)

[히스토리]

버전변경 사항
v18.0.0callback 인수에 잘못된 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE를 throw합니다.

DNS 프로토콜을 사용하여 모든 레코드( ANY 또는 * 쿼리라고도 함)를 확인합니다. callback 함수에 전달되는 ret 인수는 다양한 유형의 레코드를 포함하는 배열이 됩니다. 각 객체에는 현재 레코드의 유형을 나타내는 type 속성이 있습니다. 그리고 type에 따라 객체에 추가 속성이 표시됩니다.

유형속성
'A'address / ttl
'AAAA'address / ttl
'CNAME'value
'MX'참조 dns.resolveMx()
'NAPTR'참조 dns.resolveNaptr()
'NS'value
'PTR'value
'SOA'참조 dns.resolveSoa()
'SRV'참조 dns.resolveSrv()
'TXT'이 레코드 유형에는 dns.resolveTxt()를 참조하는 entries라는 배열 속성이 포함됩니다. 예: { entries: ['...'], type: 'TXT' }

콜백에 전달되는 ret 객체의 예는 다음과 같습니다.

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

DNS 서버 운영자는 ANY 쿼리에 응답하지 않도록 선택할 수 있습니다. dns.resolve4(), dns.resolveMx() 등의 개별 메서드를 호출하는 것이 더 나을 수 있습니다. 자세한 내용은 RFC 8482를 참조하십시오.

dns.resolveCname(hostname, callback)

[History]

VersionChanges
v18.0.0callback 인수에 잘못된 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE를 throw합니다.
v0.3.2추가됨: v0.3.2

DNS 프로토콜을 사용하여 hostname에 대한 CNAME 레코드를 확인합니다. callback 함수에 전달되는 addresses 인수에는 hostname에 사용 가능한 정규 이름 레코드 배열이 포함됩니다(예: ['bar.example.com']).

dns.resolveCaa(hostname, callback)

[History]

VersionChanges
v18.0.0callback 인수에 잘못된 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE를 throw합니다.
v15.0.0, v14.17.0추가됨: v15.0.0, v14.17.0

DNS 프로토콜을 사용하여 hostname에 대한 CAA 레코드를 확인합니다. callback 함수에 전달되는 addresses 인수에는 hostname에 사용 가능한 인증 기관 권한 레코드 배열이 포함됩니다(예: [{critical: 0, iodef: 'mailto:[email protected]'}, {critical: 128, issue: 'pki.example.com'}]).

dns.resolveMx(hostname, callback)

[히스토리]

버전변경 사항
v18.0.0callback 인수에 잘못된 콜백을 전달하면 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE를 throw합니다.
v0.1.27추가됨: v0.1.27

DNS 프로토콜을 사용하여 hostname의 메일 교환 레코드(MX 레코드)를 확인합니다. callback 함수에 전달되는 addresses 인수에는 priorityexchange 속성(예: [{priority: 10, exchange: 'mx.example.com'}, ...])을 포함하는 객체의 배열이 포함됩니다.

dns.resolveNaptr(hostname, callback)

[히스토리]

버전변경 사항
v18.0.0callback 인수에 잘못된 콜백을 전달하면 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE를 throw합니다.
v0.9.12추가됨: v0.9.12

DNS 프로토콜을 사용하여 hostname의 정규 표현식 기반 레코드(NAPTR 레코드)를 확인합니다. callback 함수에 전달되는 addresses 인수에는 다음 속성을 가진 객체의 배열이 포함됩니다.

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

[History]

버전변경 사항
v18.0.0callback 인수에 잘못된 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE를 throw합니다.
v0.1.90추가됨: v0.1.90

DNS 프로토콜을 사용하여 hostname의 이름 서버 레코드(NS 레코드)를 확인합니다. callback 함수에 전달되는 addresses 인수에는 hostname에 사용 가능한 이름 서버 레코드의 배열이 포함됩니다(예: ['ns1.example.com', 'ns2.example.com']).

dns.resolvePtr(hostname, callback)

[History]

버전변경 사항
v18.0.0callback 인수에 잘못된 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE를 throw합니다.
v6.0.0추가됨: v6.0.0

DNS 프로토콜을 사용하여 hostname의 포인터 레코드(PTR 레코드)를 확인합니다. callback 함수에 전달되는 addresses 인수는 응답 레코드가 포함된 문자열 배열입니다.

dns.resolveSoa(hostname, callback)

[History]

버전변경 사항
v18.0.0callback 인수에 잘못된 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE를 throw합니다.
v0.11.10추가됨: v0.11.10

DNS 프로토콜을 사용하여 hostname의 권한 시작 레코드(SOA 레코드)를 확인합니다. callback 함수에 전달되는 address 인수는 다음 속성을 가진 객체입니다.

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

[History]

버전변경 사항
v18.0.0callback 인수에 잘못된 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE를 throw합니다.
v0.1.27추가됨: v0.1.27

DNS 프로토콜을 사용하여 hostname에 대한 서비스 레코드(SRV 레코드)를 확인합니다. callback 함수에 전달되는 addresses 인수는 다음 속성을 가진 객체의 배열입니다.

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

dns.resolveTxt(hostname, callback)

[History]

버전변경 사항
v18.0.0callback 인수에 잘못된 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE를 throw합니다.
v0.1.27추가됨: v0.1.27

DNS 프로토콜을 사용하여 hostname에 대한 텍스트 쿼리(TXT 레코드)를 확인합니다. callback 함수에 전달되는 records 인수는 hostname에 사용 가능한 텍스트 레코드의 2차원 배열입니다 (예: [ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]). 각 하위 배열은 하나의 레코드의 TXT 청크를 포함합니다. 사용 사례에 따라 이러한 청크들을 연결하거나 별도로 처리할 수 있습니다.

dns.reverse(ip, callback)

추가됨: v0.1.16

IPv4 또는 IPv6 주소를 호스트 이름 배열로 확인하는 역방향 DNS 쿼리를 수행합니다.

오류 발생 시 errError 객체이며, err.codeDNS 오류 코드 중 하나입니다.

dns.setDefaultResultOrder(order)

[히스토리]

버전변경 사항
v22.1.0, v20.13.0ipv6first 값이 지원됩니다.
v17.0.0기본값이 verbatim으로 변경되었습니다.
v16.4.0, v14.18.0추가됨: v16.4.0, v14.18.0
  • order <string>'ipv4first', 'ipv6first' 또는 'verbatim'이어야 합니다.

dns.lookup()dnsPromises.lookup()에서 order의 기본값을 설정합니다. 값은 다음과 같을 수 있습니다.

  • ipv4first: 기본 orderipv4first로 설정합니다.
  • ipv6first: 기본 orderipv6first로 설정합니다.
  • verbatim: 기본 orderverbatim으로 설정합니다.

기본값은 verbatim이며 dns.setDefaultResultOrder()--dns-result-order보다 우선 순위가 높습니다. 워커 스레드를 사용할 때 메인 스레드의 dns.setDefaultResultOrder()는 워커의 기본 dns 순서에 영향을 미치지 않습니다.

dns.getDefaultResultOrder()

[히스토리]

버전변경 사항
v22.1.0, v20.13.0ipv6first 값이 지원됩니다.
v20.1.0, v18.17.0추가됨: v20.1.0, v18.17.0

dns.lookup()dnsPromises.lookup()에서 order의 기본값을 가져옵니다. 값은 다음과 같을 수 있습니다.

  • ipv4first: order의 기본값이 ipv4first인 경우.
  • ipv6first: order의 기본값이 ipv6first인 경우.
  • verbatim: order의 기본값이 verbatim인 경우.

dns.setServers(servers)

추가됨: v0.11.3

DNS 확인을 수행할 때 사용할 서버의 IP 주소와 포트를 설정합니다. servers 인수는 RFC 5952 형식의 주소 배열입니다. 포트가 IANA 기본 DNS 포트(53)인 경우 생략할 수 있습니다.

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

잘못된 주소를 제공하면 오류가 발생합니다.

DNS 쿼리가 진행 중인 동안에는 dns.setServers() 메서드를 호출하면 안 됩니다.

dns.setServers() 메서드는 dns.resolve(), dns.resolve*()dns.reverse()에만 영향을 미치며 (특히 dns.lookup()에는 영향을 미치지 않습니다).

이 메서드는 resolve.conf와 매우 유사하게 작동합니다. 즉, 제공된 첫 번째 서버로 확인을 시도하는 결과가 NOTFOUND 오류인 경우 resolve() 메서드는 제공된 후속 서버로 확인을 시도하지 않습니다. 대체 DNS 서버는 이전 서버의 시간 초과 또는 다른 오류가 발생한 경우에만 사용됩니다.

DNS promises API

[히스토리]

버전변경 사항
v15.0.0require('dns/promises')로 공개됨
v11.14.0, v10.17.0이 API는 더 이상 실험적이지 않습니다.
v10.6.0추가됨: v10.6.0

dns.promises API는 콜백을 사용하는 대신 Promise 객체를 반환하는 비동기 DNS 메서드의 대체 집합을 제공합니다. 이 API는 require('node:dns').promises 또는 require('node:dns/promises')를 통해 액세스할 수 있습니다.

클래스: dnsPromises.Resolver

추가됨: v10.6.0

DNS 요청을 위한 독립적인 확인자입니다.

새 확인자를 생성하면 기본 서버 설정이 사용됩니다. resolver.setServers()를 사용하여 확인자에 사용되는 서버를 설정해도 다른 확인자에는 영향을 미치지 않습니다.

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

// 이 요청은 전역 설정과 관계없이 4.4.4.4의 서버를 사용합니다.
const addresses = await resolver.resolve4('example.org')
js
const { Resolver } = require('node:dns').promises
const resolver = new Resolver()
resolver.setServers(['4.4.4.4'])

// 이 요청은 전역 설정과 관계없이 4.4.4.4의 서버를 사용합니다.
resolver.resolve4('example.org').then(addresses => {
  // ...
})

// 또는 async-await 스타일을 사용하여 동일한 코드를 작성할 수 있습니다.
;(async function () {
  const addresses = await resolver.resolve4('example.org')
})()

다음은 dnsPromises API에서 사용할 수 있는 메서드입니다.

resolver.cancel()

추가됨: v15.3.0, v14.17.0

이 resolver가 수행한 모든 미결 DNS 쿼리를 취소합니다. 해당 Promise는 ECANCELLED 코드가 포함된 오류와 함께 거부됩니다.

dnsPromises.getServers()

추가됨: v10.6.0

현재 DNS 확인에 구성된 IP 주소 문자열 배열을 반환합니다. RFC 5952에 따라 형식이 지정됩니다. 사용자 지정 포트를 사용하는 경우 문자열에 포트 섹션이 포함됩니다.

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

dnsPromises.lookup(hostname[, options])

[이력]

버전변경 사항
v22.1.0, v20.13.0verbatim 옵션은 새로운 order 옵션으로 대체되어 더 이상 사용되지 않습니다.
v10.6.0추가됨: v10.6.0
  • hostname <string>
  • options <integer> | <Object>
    • family <integer> 레코드 패밀리입니다. 4, 6 또는 0이어야 합니다. 값 0은 IPv4 또는 IPv6 주소 중 하나가 반환됨을 나타냅니다. 값 0{ all: true }와 함께 사용하는 경우(아래 참조), 시스템의 DNS resolver에 따라 IPv4 및 IPv6 주소 중 하나 또는 둘 다 반환됩니다. 기본값: 0.
    • hints <number> 지원되는 getaddrinfo 플래그 중 하나 이상입니다. 비트 단위 OR 연산을 통해 여러 플래그를 전달할 수 있습니다.
    • all <boolean> true인 경우 Promise는 배열에 있는 모든 주소를 사용하여 확인됩니다. 그렇지 않으면 단일 주소를 반환합니다. 기본값: false.
    • order <string> verbatim인 경우 Promise는 DNS resolver가 반환한 순서대로 IPv4 및 IPv6 주소를 사용하여 확인됩니다. ipv4first인 경우 IPv4 주소가 IPv6 주소 앞에 배치됩니다. ipv6first인 경우 IPv6 주소가 IPv4 주소 앞에 배치됩니다. 기본값: verbatim(주소는 다시 정렬되지 않음). 기본값은 dns.setDefaultResultOrder() 또는 --dns-result-order를 사용하여 구성할 수 있습니다. 새로운 코드는 { order: 'verbatim' }을 사용해야 합니다.
    • verbatim <boolean> true인 경우 Promise는 DNS resolver가 반환한 순서대로 IPv4 및 IPv6 주소를 사용하여 확인됩니다. false인 경우 IPv4 주소가 IPv6 주소 앞에 배치됩니다. 이 옵션은 order로 대체되어 더 이상 사용되지 않습니다. 둘 다 지정된 경우 order가 더 높은 우선 순위를 갖습니다. 새로운 코드는 order만 사용해야 합니다. 기본값: 현재 false(주소는 다시 정렬됨)이지만 가까운 미래에 변경될 것으로 예상됩니다. 기본값은 dns.setDefaultResultOrder() 또는 --dns-result-order를 사용하여 구성할 수 있습니다.

호스트 이름(예: 'nodejs.org')을 처음 발견된 A(IPv4) 또는 AAAA(IPv6) 레코드로 확인합니다. 모든 option 속성은 선택 사항입니다. options가 정수인 경우 4 또는 6이어야 합니다. options가 제공되지 않으면 발견된 경우 IPv4 또는 IPv6 주소 또는 둘 다 반환됩니다.

all 옵션이 true로 설정된 경우 Promiseaddressfamily 속성이 있는 객체의 배열인 addresses를 사용하여 확인됩니다.

오류 발생 시 PromiseError 객체를 사용하여 거부되며, 여기서 err.code는 오류 코드입니다. 호스트 이름이 없을 때뿐만 아니라 파일 디스크립터를 사용할 수 없을 때와 같은 다른 방식으로 조회가 실패할 때도 err.code'ENOTFOUND'로 설정된다는 점에 유의하십시오.

dnsPromises.lookup()는 반드시 DNS 프로토콜과 관련이 있는 것은 아닙니다. 구현은 이름과 주소를 서로 연결할 수 있는 운영 체제 기능을 사용합니다. 이 구현은 Node.js 프로그램의 동작에 미묘하지만 중요한 영향을 미칠 수 있습니다. dnsPromises.lookup()을 사용하기 전에 구현 고려 사항 섹션을 참조하십시오.

사용 예:

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

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

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

추가됨: v10.6.0

운영 체제의 기본 getnameinfo 구현을 사용하여 지정된 addressport를 호스트 이름 및 서비스로 확인합니다.

address가 유효한 IP 주소가 아니면 TypeError가 발생합니다. port는 숫자로 강제 변환됩니다. 법적 포트가 아니면 TypeError가 발생합니다.

오류 발생 시, Promiseerr.code가 오류 코드인 Error 객체로 거부됩니다.

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

console.log(result.hostname, result.service) // localhost ssh 출력
js
const dnsPromises = require('node:dns').promises
dnsPromises.lookupService('127.0.0.1', 22).then(result => {
  console.log(result.hostname, result.service)
  // localhost ssh 출력
})

dnsPromises.resolve(hostname[, rrtype])

추가됨: v10.6.0

  • hostname <string> 확인할 호스트 이름.
  • rrtype <string> 리소스 레코드 유형. 기본값: 'A'.

DNS 프로토콜을 사용하여 호스트 이름(예: 'nodejs.org')을 리소스 레코드 배열로 확인합니다. 성공하면 Promise는 리소스 레코드 배열로 확인됩니다. 개별 결과의 유형과 구조는 rrtype에 따라 다릅니다.

rrtyperecords 포함 내용결과 유형약식 메서드
'A'IPv4 주소 (기본값)<string>dnsPromises.resolve4()
'AAAA'IPv6 주소<string>dnsPromises.resolve6()
'ANY'모든 레코드<Object>dnsPromises.resolveAny()
'CAA'CA 권한 레코드<Object>dnsPromises.resolveCaa()
'CNAME'정식 이름 레코드<string>dnsPromises.resolveCname()
'MX'메일 교환 레코드<Object>dnsPromises.resolveMx()
'NAPTR'이름 권한 포인터 레코드<Object>dnsPromises.resolveNaptr()
'NS'이름 서버 레코드<string>dnsPromises.resolveNs()
'PTR'포인터 레코드<string>dnsPromises.resolvePtr()
'SOA'권한 시작 레코드<Object>dnsPromises.resolveSoa()
'SRV'서비스 레코드<Object>dnsPromises.resolveSrv()
'TXT'텍스트 레코드<string[]>dnsPromises.resolveTxt()

오류 발생 시, Promiseerr.codeDNS 오류 코드 중 하나인 Error 객체로 거부됩니다.

dnsPromises.resolve4(hostname[, options])

추가됨: v10.6.0

  • hostname <string> 해석할 호스트 이름.
  • options <Object>
    • ttl <boolean> 각 레코드의 Time-To-Live 값(TTL)을 검색합니다. true인 경우, 문자열 배열 대신 { address: '1.2.3.4', ttl: 60 } 객체의 배열로 Promise가 해결되며, TTL은 초 단위로 표시됩니다.

DNS 프로토콜을 사용하여 hostname에 대한 IPv4 주소(A 레코드)를 확인합니다. 성공하면 Promise는 IPv4 주소 배열(예: ['74.125.79.104', '74.125.79.105', '74.125.79.106'])로 해결됩니다.

dnsPromises.resolve6(hostname[, options])

추가됨: v10.6.0

  • hostname <string> 해석할 호스트 이름.
  • options <Object>
    • ttl <boolean> 각 레코드의 Time-To-Live 값(TTL)을 검색합니다. true인 경우, 문자열 배열 대신 { address: '0:1:2:3:4:5:6:7', ttl: 60 } 객체의 배열로 Promise가 해결되며, TTL은 초 단위로 표시됩니다.

DNS 프로토콜을 사용하여 hostname에 대한 IPv6 주소(AAAA 레코드)를 확인합니다. 성공하면 Promise는 IPv6 주소 배열로 해결됩니다.

dnsPromises.resolveAny(hostname)

추가됨: v10.6.0

DNS 프로토콜을 사용하여 모든 레코드(ANY 또는 * 쿼리라고도 함)를 확인합니다. 성공하면 Promise는 다양한 유형의 레코드가 포함된 배열로 해결됩니다. 각 객체에는 현재 레코드의 유형을 나타내는 type 속성이 있습니다. 그리고 type에 따라 객체에 추가 속성이 있을 수 있습니다.

유형속성
'A'address / ttl
'AAAA'address / ttl
'CNAME'value
'MX'dnsPromises.resolveMx() 참조
'NAPTR'dnsPromises.resolveNaptr() 참조
'NS'value
'PTR'value
'SOA'dnsPromises.resolveSoa() 참조
'SRV'dnsPromises.resolveSrv() 참조
'TXT'dnsPromises.resolveTxt()를 참조하는 entries라는 배열 속성을 포함하는 이 레코드 유형, 예: { entries: ['...'], type: 'TXT' }

결과 객체의 예시는 다음과 같습니다.

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

dnsPromises.resolveCaa(hostname)

추가됨: v15.0.0, v14.17.0

DNS 프로토콜을 사용하여 hostname에 대한 CAA 레코드를 확인합니다. 성공하면, Promisehostname에 사용 가능한 인증 기관 권한 레코드가 포함된 객체의 배열로 확인됩니다 (예: [{critical: 0, iodef: 'mailto:[email protected]'},{critical: 128, issue: 'pki.example.com'}]).

dnsPromises.resolveCname(hostname)

추가됨: v10.6.0

DNS 프로토콜을 사용하여 hostname에 대한 CNAME 레코드를 확인합니다. 성공하면, Promisehostname에 사용 가능한 정규 이름 레코드의 배열로 확인됩니다 (예: ['bar.example.com']).

dnsPromises.resolveMx(hostname)

추가됨: v10.6.0

DNS 프로토콜을 사용하여 hostname에 대한 메일 교환 레코드(MX 레코드)를 확인합니다. 성공하면, Promisepriorityexchange 속성을 포함하는 객체의 배열로 확인됩니다 (예: [{priority: 10, exchange: 'mx.example.com'}, ...]).

dnsPromises.resolveNaptr(hostname)

추가됨: v10.6.0

DNS 프로토콜을 사용하여 hostname에 대한 정규식 기반 레코드(NAPTR 레코드)를 확인합니다. 성공하면, Promise는 다음 속성을 가진 객체의 배열로 확인됩니다.

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

dnsPromises.resolveNs(hostname)

추가됨: v10.6.0

DNS 프로토콜을 사용하여 hostname에 대한 이름 서버 레코드(NS 레코드)를 확인합니다. 성공하면, Promisehostname에 사용 가능한 이름 서버 레코드의 배열로 확인됩니다 (예: ['ns1.example.com', 'ns2.example.com']).

dnsPromises.resolvePtr(hostname)

추가됨: v10.6.0

DNS 프로토콜을 사용하여 hostname에 대한 포인터 레코드(PTR 레코드)를 확인합니다. 성공하면 Promise는 응답 레코드가 포함된 문자열 배열로 확인됩니다.

dnsPromises.resolveSoa(hostname)

추가됨: v10.6.0

DNS 프로토콜을 사용하여 hostname에 대한 권한 시작 레코드(SOA 레코드)를 확인합니다. 성공하면 Promise는 다음 속성을 가진 객체로 확인됩니다.

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

dnsPromises.resolveSrv(hostname)

추가됨: v10.6.0

DNS 프로토콜을 사용하여 hostname에 대한 서비스 레코드(SRV 레코드)를 확인합니다. 성공하면 Promise는 다음 속성을 가진 객체의 배열로 확인됩니다.

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

dnsPromises.resolveTxt(hostname)

추가됨: v10.6.0

DNS 프로토콜을 사용하여 hostname에 대한 텍스트 쿼리(TXT 레코드)를 확인합니다. 성공하면 Promisehostname에 사용 가능한 텍스트 레코드의 2차원 배열로 확인됩니다 (예: [ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]). 각 하위 배열은 하나의 레코드의 TXT 청크를 포함합니다. 사용 사례에 따라 이러한 청크들을 결합하거나 별도로 처리할 수 있습니다.

dnsPromises.reverse(ip)

추가됨: v10.6.0

IPv4 또는 IPv6 주소를 호스트 이름 배열로 확인하는 역방향 DNS 쿼리를 수행합니다.

오류 발생 시, PromiseError 객체를 사용하여 거부되며, 여기서 err.codeDNS 오류 코드 중 하나입니다.

dnsPromises.setDefaultResultOrder(order)

[히스토리]

버전변경 사항
v22.1.0, v20.13.0ipv6first 값이 지원됩니다.
v17.0.0기본값이 verbatim으로 변경되었습니다.
v16.4.0, v14.18.0추가됨: v16.4.0, v14.18.0
  • order <string>'ipv4first', 'ipv6first' 또는 'verbatim'이어야 합니다.

dns.lookup()dnsPromises.lookup()에서 order의 기본값을 설정합니다. 값은 다음과 같을 수 있습니다.

  • ipv4first: 기본 orderipv4first로 설정합니다.
  • ipv6first: 기본 orderipv6first로 설정합니다.
  • verbatim: 기본 orderverbatim으로 설정합니다.

기본값은 verbatim이며 dnsPromises.setDefaultResultOrder()--dns-result-order보다 우선 순위가 높습니다. 워커 스레드를 사용할 때, 메인 스레드의 dnsPromises.setDefaultResultOrder()는 워커의 기본 dns 순서에 영향을 미치지 않습니다.

dnsPromises.getDefaultResultOrder()

추가됨: v20.1.0, v18.17.0

dnsOrder의 값을 가져옵니다.

dnsPromises.setServers(servers)

추가됨: v10.6.0

DNS 확인을 수행할 때 사용할 서버의 IP 주소와 포트를 설정합니다. servers 인수는 RFC 5952 형식의 주소 배열입니다. 포트가 IANA 기본 DNS 포트(53)인 경우 생략할 수 있습니다.

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

잘못된 주소가 제공되면 오류가 발생합니다.

dnsPromises.setServers() 메서드는 DNS 쿼리가 진행 중일 때 호출할 수 없습니다.

이 메서드는 resolve.conf와 매우 유사하게 작동합니다. 즉, 제공된 첫 번째 서버로 확인을 시도할 때 NOTFOUND 오류가 발생하면 resolve() 메서드는 제공된 후속 서버로 확인을 시도하지 않습니다. 대체 DNS 서버는 이전 서버가 시간 초과되거나 다른 오류가 발생하는 경우에만 사용됩니다.

에러 코드

각 DNS 쿼리는 다음 에러 코드 중 하나를 반환할 수 있습니다.

  • dns.NODATA: DNS 서버가 데이터가 없는 응답을 반환했습니다.
  • dns.FORMERR: DNS 서버가 쿼리 형식이 잘못되었다고 주장합니다.
  • dns.SERVFAIL: DNS 서버가 일반적인 오류를 반환했습니다.
  • dns.NOTFOUND: 도메인 이름을 찾을 수 없습니다.
  • dns.NOTIMP: DNS 서버가 요청된 작업을 구현하지 않습니다.
  • dns.REFUSED: DNS 서버가 쿼리를 거부했습니다.
  • dns.BADQUERY: DNS 쿼리 형식이 잘못되었습니다.
  • dns.BADNAME: 호스트 이름 형식이 잘못되었습니다.
  • dns.BADFAMILY: 지원되지 않는 주소 패밀리입니다.
  • dns.BADRESP: DNS 응답 형식이 잘못되었습니다.
  • dns.CONNREFUSED: DNS 서버에 연결할 수 없습니다.
  • dns.TIMEOUT: DNS 서버에 연결하는 동안 시간 초과가 발생했습니다.
  • dns.EOF: 파일 끝입니다.
  • dns.FILE: 파일 읽기 오류입니다.
  • dns.NOMEM: 메모리가 부족합니다.
  • dns.DESTRUCTION: 채널이 파괴되고 있습니다.
  • dns.BADSTR: 형식이 잘못된 문자열입니다.
  • dns.BADFLAGS: 잘못된 플래그가 지정되었습니다.
  • dns.NONAME: 지정된 호스트 이름이 숫자가 아닙니다.
  • dns.BADHINTS: 잘못된 힌트 플래그가 지정되었습니다.
  • dns.NOTINITIALIZED: c-ares 라이브러리 초기화가 아직 수행되지 않았습니다.
  • dns.LOADIPHLPAPI: iphlpapi.dll 로드 오류입니다.
  • dns.ADDRGETNETWORKPARAMS: GetNetworkParams 함수를 찾을 수 없습니다.
  • dns.CANCELLED: DNS 쿼리가 취소되었습니다.

dnsPromises API는 dnsPromises.NODATA와 같이 위의 에러 코드를 내보냅니다.

구현 고려 사항

dns.lookup()과 다양한 dns.resolve*()/dns.reverse() 함수는 네트워크 이름과 네트워크 주소(또는 그 반대)를 연결하는 동일한 목표를 가지고 있지만, 동작은 상당히 다릅니다. 이러한 차이는 Node.js 프로그램의 동작에 미묘하지만 중요한 영향을 미칠 수 있습니다.

dns.lookup()

내부적으로 dns.lookup()은 다른 대부분의 프로그램과 동일한 운영 체제 기능을 사용합니다. 예를 들어, dns.lookup()ping 명령과 거의 동일한 방식으로 지정된 이름을 확인합니다. 대부분의 POSIX 유사 운영 체제에서 dns.lookup() 함수의 동작은 nsswitch.conf(5) 및/또는 resolv.conf(5)의 설정을 변경하여 수정할 수 있지만, 이러한 파일을 변경하면 동일한 운영 체제에서 실행되는 다른 모든 프로그램의 동작도 변경됩니다.

dns.lookup() 호출은 JavaScript 관점에서 비동기적이지만, libuv의 스레드 풀에서 실행되는 getaddrinfo(3)에 대한 동기 호출로 구현됩니다. 이는 일부 애플리케이션에 놀라운 부정적인 성능 영향을 미칠 수 있습니다. 자세한 내용은 UV_THREADPOOL_SIZE 설명서를 참조하십시오.

다양한 네트워킹 API는 호스트 이름을 확인하기 위해 내부적으로 dns.lookup()을 호출합니다. 이것이 문제가 되는 경우 dns.resolve()를 사용하여 호스트 이름을 주소로 확인하고 호스트 이름 대신 주소를 사용하는 것을 고려하십시오. 또한 일부 네트워킹 API(예: socket.connect()dgram.createSocket())는 기본 확인기인 dns.lookup()을 대체할 수 있도록 허용합니다.

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

이 함수들은 dns.lookup()과는 매우 다르게 구현됩니다. getaddrinfo(3)을 사용하지 않으며 항상 네트워크에서 DNS 쿼리를 수행합니다. 이 네트워크 통신은 항상 비동기적으로 수행되며 libuv의 스레드풀을 사용하지 않습니다.

결과적으로, 이 함수들은 libuv의 스레드풀에서 발생하는 다른 처리에 dns.lookup()이 가질 수 있는 것과 같은 부정적인 영향을 미칠 수 없습니다.

이 함수들은 dns.lookup()이 사용하는 것과 동일한 설정 파일 집합을 사용하지 않습니다. 예를 들어, /etc/hosts의 설정을 사용하지 않습니다.