DNS
[Stable: 2 - Stable]
Stable: 2 Stability: 2 - Stable
소스 코드: lib/dns.js
node:dns
모듈은 이름 확인을 가능하게 합니다. 예를 들어, 호스트 이름의 IP 주소를 조회하는 데 사용합니다.
도메인 이름 시스템(DNS)으로 명명되었지만, 항상 조회에 DNS 프로토콜을 사용하는 것은 아닙니다. dns.lookup()
은 운영 체제 기능을 사용하여 이름 확인을 수행합니다. 네트워크 통신을 수행할 필요가 없을 수도 있습니다. 동일한 시스템의 다른 애플리케이션이 수행하는 방식으로 이름 확인을 수행하려면 dns.lookup()
을 사용합니다.
import dns from 'node:dns'
dns.lookup('example.org', (err, address, family) => {
console.log('address: %j family: IPv%s', address, family)
})
// address: "2606:2800:21f:cb07:6820:80da:af6b:8b2c" family: IPv6
const dns = require('node:dns')
dns.lookup('example.org', (err, address, family) => {
console.log('address: %j family: IPv%s', address, family)
})
// address: "2606:2800:21f:cb07:6820:80da:af6b:8b2c" family: IPv6
node:dns
모듈의 다른 모든 함수는 실제 DNS 서버에 연결하여 이름 확인을 수행합니다. 항상 네트워크를 사용하여 DNS 쿼리를 수행합니다. 이러한 함수는 dns.lookup()
에서 사용하는 것과 동일한 구성 파일 집합(예: /etc/hosts
)을 사용하지 않습니다. 다른 이름 확인 기능을 우회하여 항상 DNS 쿼리를 수행하려면 이러한 함수를 사용합니다.
import dns from 'node:dns'
dns.resolve4('archive.org', (err, addresses) => {
if (err) throw err
console.log(`addresses: ${JSON.stringify(addresses)}`)
addresses.forEach(a => {
dns.reverse(a, (err, hostnames) => {
if (err) {
throw err
}
console.log(`reverse for ${a}: ${JSON.stringify(hostnames)}`)
})
})
})
const dns = require('node:dns')
dns.resolve4('archive.org', (err, addresses) => {
if (err) throw err
console.log(`addresses: ${JSON.stringify(addresses)}`)
addresses.forEach(a => {
dns.reverse(a, (err, hostnames) => {
if (err) {
throw err
}
console.log(`reverse for ${a}: ${JSON.stringify(hostnames)}`)
})
})
})
자세한 내용은 구현 고려 사항 섹션을 참조하십시오.
클래스: dns.Resolver
추가됨: v8.3.0
DNS 요청을 위한 독립적인 resolver입니다.
새로운 resolver를 생성하면 기본 서버 설정이 사용됩니다. resolver.setServers()
를 사용하여 resolver에 사용되는 서버를 설정해도 다른 resolver에는 영향을 미치지 않습니다.
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) => {
// ...
})
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.getServers()
resolver.resolve()
resolver.resolve4()
resolver.resolve6()
resolver.resolveAny()
resolver.resolveCaa()
resolver.resolveCname()
resolver.resolveMx()
resolver.resolveNaptr()
resolver.resolveNs()
resolver.resolvePtr()
resolver.resolveSoa()
resolver.resolveSrv()
resolver.resolveTxt()
resolver.reverse()
resolver.setServers()
Resolver([options])
[History]
버전 | 변경 사항 |
---|---|
v16.7.0, v14.18.0 | options 객체가 이제 tries 옵션을 허용합니다. |
v12.18.3 | 생성자가 이제 options 객체를 허용합니다. 단일 지원 옵션은 timeout 입니다. |
v8.3.0 | 추가됨: v8.3.0 |
새로운 resolver를 생성합니다.
options
<Object>
resolver.cancel()
추가됨: v8.3.0
이 resolver가 수행한 모든 미결 DNS 쿼리를 취소합니다. 해당 콜백은 ECANCELLED
코드의 오류와 함께 호출됩니다.
resolver.setLocalAddress([ipv4][, ipv6])
추가됨: v15.1.0, v14.17.0
resolver 인스턴스는 지정된 IP 주소에서 요청을 보냅니다. 이를 통해 다중 호밍 시스템에서 사용될 때 아웃바운드 인터페이스를 지정할 수 있습니다.
v4 또는 v6 주소가 지정되지 않으면 기본값으로 설정되고 운영 체제가 자동으로 로컬 주소를 선택합니다.
resolver는 IPv4 DNS 서버에 요청을 할 때 v4 로컬 주소를 사용하고, IPv6 DNS 서버에 요청을 할 때 v6 로컬 주소를 사용합니다. 해석 요청의 rrtype
은 사용되는 로컬 주소에 영향을 미치지 않습니다.
dns.getServers()
추가됨: v0.11.3
- 반환값: <string[]>
현재 DNS 확인에 대해 구성된 IP 주소 문자열의 배열을 반환합니다. RFC 5952에 따라 형식이 지정됩니다. 사용자 지정 포트가 사용되는 경우 문자열에 포트 섹션이 포함됩니다.
;['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.0 | verbatim 옵션이 새로운 order 옵션으로 대체되어 더 이상 사용되지 않습니다. |
v18.4.0 | node:net 과의 호환성을 위해 옵션 객체를 전달할 때 family 옵션은 문자열 'IPv4' 또는 문자열 'IPv6' 일 수 있습니다. |
v18.0.0 | callback 인수에 잘못된 콜백을 전달하면 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE 가 throw됩니다. |
v17.0.0 | verbatim 옵션의 기본값이 이제 true 입니다. |
v8.5.0 | verbatim 옵션이 지원됩니다. |
v1.2.0 | all 옵션이 지원됩니다. |
v0.1.90 | 추가됨: v0.1.90 |
hostname
<string>family
<integer> | <string> 레코드 패밀리.4
,6
또는0
이어야 합니다. 하위 호환성을 위해'IPv4'
및'IPv6'
는 각각4
및6
으로 해석됩니다. 값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>
호스트 이름(예: 'nodejs.org'
)을 처음 발견된 A(IPv4) 또는 AAAA(IPv6) 레코드로 확인합니다. 모든 option
속성은 선택 사항입니다. options
가 정수이면 4
또는 6
이어야 합니다. options
가 제공되지 않으면 발견된 경우 IPv4 또는 IPv6 주소 또는 둘 다 반환됩니다.
all
옵션이 true
로 설정되면 callback
의 인수는 (err, addresses)
로 변경되며, addresses
는 address
및 family
속성을 가진 객체의 배열입니다.
오류 발생 시 err
은 Error
객체이며, err.code
는 오류 코드입니다. err.code
는 호스트 이름이 존재하지 않는 경우뿐만 아니라 사용 가능한 파일 디스크립터가 없는 등 다른 방식으로 조회가 실패하는 경우에도 'ENOTFOUND'
로 설정됩니다.
dns.lookup()
은 반드시 DNS 프로토콜과 관련이 있는 것은 아닙니다. 구현은 이름과 주소를 서로 연결할 수 있는 운영 체제 기능을 사용합니다. 이 구현은 모든 Node.js 프로그램의 동작에 미묘하지만 중요한 영향을 미칠 수 있습니다. dns.lookup()
을 사용하기 전에 구현 고려 사항 섹션을 참조하십시오.
사용 예:
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}]
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()
된 버전으로 호출되고 all
이 true
로 설정되지 않은 경우 address
및 family
속성을 가진 Object
에 대한 Promise
를 반환합니다.
지원되는 getaddrinfo 플래그
[히스토리]
버전 | 변경 사항 |
---|---|
v13.13.0, v12.17.0 | dns.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.0 | callback 인수에 잘못된 콜백을 전달하면 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE 가 throw됩니다. |
v0.11.14 | 추가됨: v0.11.14 |
address
<string>port
<number>callback
<Function>
운영 체제의 기본 getnameinfo
구현을 사용하여 지정된 address
와 port
를 호스트 이름과 서비스로 확인합니다.
address
가 유효한 IP 주소가 아닌 경우 TypeError
가 throw됩니다. port
는 숫자로 강제 변환됩니다. 유효한 포트가 아닌 경우 TypeError
가 throw됩니다.
오류 발생 시 err
는 Error
객체이며, err.code
는 오류 코드입니다.
import dns from 'node:dns'
dns.lookupService('127.0.0.1', 22, (err, hostname, service) => {
console.log(hostname, service)
// 출력: localhost ssh
})
const dns = require('node:dns')
dns.lookupService('127.0.0.1', 22, (err, hostname, service) => {
console.log(hostname, service)
// 출력: localhost ssh
})
이 메서드가 util.promisify()
된 버전으로 호출되는 경우, hostname
및 service
속성을 가진 Object
에 대한 Promise
를 반환합니다.
dns.resolve(hostname[, rrtype], callback)
[히스토리]
버전 | 변경 사항 |
---|---|
v18.0.0 | callback 인수에 잘못된 콜백을 전달하면 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE 를 throw합니다. |
v0.1.27 | 추가됨: v0.1.27 |
hostname
<string> 호스트 이름을 확인합니다.rrtype
<string> 리소스 레코드 유형. 기본값:'A'
callback
<Function>err
<Error>records
<string[]> | <Object[]> | <Object>
DNS 프로토콜을 사용하여 호스트 이름(예: 'nodejs.org'
)을 리소스 레코드 배열로 확인합니다. callback
함수는 (err, records)
인수를 갖습니다. 성공하면 records
는 리소스 레코드의 배열이 됩니다. 개별 결과의 유형과 구조는 rrtype
에 따라 다릅니다.
rrtype | records 포함 내용 | 결과 유형 | 약식 메서드 |
---|---|---|---|
'A' | IPv4 주소 (기본값) | <string> | dns.resolve4() |
'AAAA' | IPv6 주소 | <string> | dns.resolve6() |
'ANY' | 모든 레코드 | <Object> | dns.resolveAny() |
'CAA' | CA 권한 레코드 | <Object> | dns.resolveCaa() |
'CNAME' | 정규 이름 레코드 | <string> | dns.resolveCname() |
'MX' | 메일 교환 레코드 | <Object> | dns.resolveMx() |
'NAPTR' | 이름 권한 포인터 레코드 | <Object> | dns.resolveNaptr() |
'NS' | 이름 서버 레코드 | <string> | dns.resolveNs() |
'PTR' | 포인터 레코드 | <string> | dns.resolvePtr() |
'SOA' | 권한 시작 레코드 | <Object> | dns.resolveSoa() |
'SRV' | 서비스 레코드 | <Object> | dns.resolveSrv() |
'TXT' | 텍스트 레코드 | <string[]> | dns.resolveTxt() |
오류 발생 시 err
는 Error
객체이며, err.code
는 DNS 오류 코드 중 하나입니다.
dns.resolve4(hostname[, options], callback)
[History]
버전 | 변경 사항 |
---|---|
v18.0.0 | callback 인수에 잘못된 콜백을 전달하면 이제 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>err
<Error>addresses
<string[]> | <Object[]>
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.0 | callback 인수에 잘못된 콜백을 전달하면 이제 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>err
<Error>addresses
<string[]> | <Object[]>
DNS 프로토콜을 사용하여 hostname
에 대한 IPv6 주소(AAAA
레코드)를 확인합니다. callback
함수에 전달되는 addresses
인수에는 IPv6 주소의 배열이 포함됩니다.
dns.resolveAny(hostname, callback)
[히스토리]
버전 | 변경 사항 |
---|---|
v18.0.0 | callback 인수에 잘못된 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE 를 throw합니다. |
hostname
<string>callback
<Function>err
<Error>ret
<Object[]>
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
객체의 예는 다음과 같습니다.
;[
{ 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]
Version | Changes |
---|---|
v18.0.0 | callback 인수에 잘못된 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE 를 throw합니다. |
v0.3.2 | 추가됨: v0.3.2 |
hostname
<string>callback
<Function>err
<Error>addresses
<string[]>
DNS 프로토콜을 사용하여 hostname
에 대한 CNAME
레코드를 확인합니다. callback
함수에 전달되는 addresses
인수에는 hostname
에 사용 가능한 정규 이름 레코드 배열이 포함됩니다(예: ['bar.example.com']
).
dns.resolveCaa(hostname, callback)
[History]
Version | Changes |
---|---|
v18.0.0 | callback 인수에 잘못된 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE 를 throw합니다. |
v15.0.0, v14.17.0 | 추가됨: v15.0.0, v14.17.0 |
hostname
<string>callback
<Function>err
<Error>records
<Object[]>
DNS 프로토콜을 사용하여 hostname
에 대한 CAA
레코드를 확인합니다. callback
함수에 전달되는 addresses
인수에는 hostname
에 사용 가능한 인증 기관 권한 레코드 배열이 포함됩니다(예: [{critical: 0, iodef: 'mailto:[email protected]'}, {critical: 128, issue: 'pki.example.com'}]
).
dns.resolveMx(hostname, callback)
[히스토리]
버전 | 변경 사항 |
---|---|
v18.0.0 | callback 인수에 잘못된 콜백을 전달하면 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE 를 throw합니다. |
v0.1.27 | 추가됨: v0.1.27 |
hostname
<string>callback
<Function>err
<Error>addresses
<Object[]>
DNS 프로토콜을 사용하여 hostname
의 메일 교환 레코드(MX
레코드)를 확인합니다. callback
함수에 전달되는 addresses
인수에는 priority
및 exchange
속성(예: [{priority: 10, exchange: 'mx.example.com'}, ...]
)을 포함하는 객체의 배열이 포함됩니다.
dns.resolveNaptr(hostname, callback)
[히스토리]
버전 | 변경 사항 |
---|---|
v18.0.0 | callback 인수에 잘못된 콜백을 전달하면 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE 를 throw합니다. |
v0.9.12 | 추가됨: v0.9.12 |
hostname
<string>callback
<Function>err
<Error>addresses
<Object[]>
DNS 프로토콜을 사용하여 hostname
의 정규 표현식 기반 레코드(NAPTR
레코드)를 확인합니다. callback
함수에 전달되는 addresses
인수에는 다음 속성을 가진 객체의 배열이 포함됩니다.
flags
service
regexp
replacement
order
preference
{
flags: 's',
service: 'SIP+D2U',
regexp: '',
replacement: '_sip._udp.example.com',
order: 30,
preference: 100
}
dns.resolveNs(hostname, callback)
[History]
버전 | 변경 사항 |
---|---|
v18.0.0 | callback 인수에 잘못된 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE 를 throw합니다. |
v0.1.90 | 추가됨: v0.1.90 |
hostname
<string>callback
<Function>err
<Error>addresses
<string[]>
DNS 프로토콜을 사용하여 hostname
의 이름 서버 레코드(NS
레코드)를 확인합니다. callback
함수에 전달되는 addresses
인수에는 hostname
에 사용 가능한 이름 서버 레코드의 배열이 포함됩니다(예: ['ns1.example.com', 'ns2.example.com']
).
dns.resolvePtr(hostname, callback)
[History]
버전 | 변경 사항 |
---|---|
v18.0.0 | callback 인수에 잘못된 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE 를 throw합니다. |
v6.0.0 | 추가됨: v6.0.0 |
hostname
<string>callback
<Function>err
<Error>addresses
<string[]>
DNS 프로토콜을 사용하여 hostname
의 포인터 레코드(PTR
레코드)를 확인합니다. callback
함수에 전달되는 addresses
인수는 응답 레코드가 포함된 문자열 배열입니다.
dns.resolveSoa(hostname, callback)
[History]
버전 | 변경 사항 |
---|---|
v18.0.0 | callback 인수에 잘못된 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE 를 throw합니다. |
v0.11.10 | 추가됨: v0.11.10 |
hostname
<string>callback
<Function>
DNS 프로토콜을 사용하여 hostname
의 권한 시작 레코드(SOA
레코드)를 확인합니다. callback
함수에 전달되는 address
인수는 다음 속성을 가진 객체입니다.
nsname
hostmaster
serial
refresh
retry
expire
minttl
{
nsname: 'ns.example.com',
hostmaster: 'root.example.com',
serial: 2013101809,
refresh: 10000,
retry: 2400,
expire: 604800,
minttl: 3600
}
dns.resolveSrv(hostname, callback)
[History]
버전 | 변경 사항 |
---|---|
v18.0.0 | callback 인수에 잘못된 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE 를 throw합니다. |
v0.1.27 | 추가됨: v0.1.27 |
hostname
<string>callback
<Function>err
<Error>addresses
<Object[]>
DNS 프로토콜을 사용하여 hostname
에 대한 서비스 레코드(SRV
레코드)를 확인합니다. callback
함수에 전달되는 addresses
인수는 다음 속성을 가진 객체의 배열입니다.
priority
weight
port
name
{
priority: 10,
weight: 5,
port: 21223,
name: 'service.example.com'
}
dns.resolveTxt(hostname, callback)
[History]
버전 | 변경 사항 |
---|---|
v18.0.0 | callback 인수에 잘못된 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE 를 throw합니다. |
v0.1.27 | 추가됨: v0.1.27 |
hostname
<string>callback
<Function>err
<Error>records
<string[][]>
DNS 프로토콜을 사용하여 hostname
에 대한 텍스트 쿼리(TXT
레코드)를 확인합니다. callback
함수에 전달되는 records
인수는 hostname
에 사용 가능한 텍스트 레코드의 2차원 배열입니다 (예: [ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]
). 각 하위 배열은 하나의 레코드의 TXT 청크를 포함합니다. 사용 사례에 따라 이러한 청크들을 연결하거나 별도로 처리할 수 있습니다.
dns.reverse(ip, callback)
추가됨: v0.1.16
ip
<string>callback
<Function>err
<Error>hostnames
<string[]>
IPv4 또는 IPv6 주소를 호스트 이름 배열로 확인하는 역방향 DNS 쿼리를 수행합니다.
오류 발생 시 err
은 Error
객체이며, err.code
는 DNS 오류 코드 중 하나입니다.
dns.setDefaultResultOrder(order)
[히스토리]
버전 | 변경 사항 |
---|---|
v22.1.0, v20.13.0 | ipv6first 값이 지원됩니다. |
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
: 기본order
를ipv4first
로 설정합니다.ipv6first
: 기본order
를ipv6first
로 설정합니다.verbatim
: 기본order
를verbatim
으로 설정합니다.
기본값은 verbatim
이며 dns.setDefaultResultOrder()
는 --dns-result-order
보다 우선 순위가 높습니다. 워커 스레드를 사용할 때 메인 스레드의 dns.setDefaultResultOrder()
는 워커의 기본 dns 순서에 영향을 미치지 않습니다.
dns.getDefaultResultOrder()
[히스토리]
버전 | 변경 사항 |
---|---|
v22.1.0, v20.13.0 | ipv6first 값이 지원됩니다. |
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
servers
<string[]> RFC 5952 형식의 주소 배열
DNS 확인을 수행할 때 사용할 서버의 IP 주소와 포트를 설정합니다. servers
인수는 RFC 5952 형식의 주소 배열입니다. 포트가 IANA 기본 DNS 포트(53)인 경우 생략할 수 있습니다.
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.0 | require('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()
를 사용하여 확인자에 사용되는 서버를 설정해도 다른 확인자에는 영향을 미치지 않습니다.
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')
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.getServers()
resolver.resolve()
resolver.resolve4()
resolver.resolve6()
resolver.resolveAny()
resolver.resolveCaa()
resolver.resolveCname()
resolver.resolveMx()
resolver.resolveNaptr()
resolver.resolveNs()
resolver.resolvePtr()
resolver.resolveSoa()
resolver.resolveSrv()
resolver.resolveTxt()
resolver.reverse()
resolver.setServers()
resolver.cancel()
추가됨: v15.3.0, v14.17.0
이 resolver가 수행한 모든 미결 DNS 쿼리를 취소합니다. 해당 Promise는 ECANCELLED
코드가 포함된 오류와 함께 거부됩니다.
dnsPromises.getServers()
추가됨: v10.6.0
- 반환값: <string[]>
현재 DNS 확인에 구성된 IP 주소 문자열 배열을 반환합니다. RFC 5952에 따라 형식이 지정됩니다. 사용자 지정 포트를 사용하는 경우 문자열에 포트 섹션이 포함됩니다.
;['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.0 | verbatim 옵션은 새로운 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
로 설정된 경우 Promise
는 address
및 family
속성이 있는 객체의 배열인 addresses
를 사용하여 확인됩니다.
오류 발생 시 Promise
는 Error
객체를 사용하여 거부되며, 여기서 err.code
는 오류 코드입니다. 호스트 이름이 없을 때뿐만 아니라 파일 디스크립터를 사용할 수 없을 때와 같은 다른 방식으로 조회가 실패할 때도 err.code
가 'ENOTFOUND'
로 설정된다는 점에 유의하십시오.
dnsPromises.lookup()
는 반드시 DNS 프로토콜과 관련이 있는 것은 아닙니다. 구현은 이름과 주소를 서로 연결할 수 있는 운영 체제 기능을 사용합니다. 이 구현은 Node.js 프로그램의 동작에 미묘하지만 중요한 영향을 미칠 수 있습니다. dnsPromises.lookup()
을 사용하기 전에 구현 고려 사항 섹션을 참조하십시오.
사용 예:
import dns from 'node:dns'
const dnsPromises = dns.promises
const options = {
family: 6,
hints: dns.ADDRCONFIG | dns.V4MAPPED,
}
await dnsPromises.lookup('example.org', options).then(result => {
console.log('address: %j family: IPv%s', result.address, result.family)
// address: "2606:2800:21f:cb07:6820:80da:af6b:8b2c" family: IPv6
})
// When options.all is true, the result will be an Array.
options.all = true
await dnsPromises.lookup('example.org', options).then(result => {
console.log('addresses: %j', result)
// addresses: [{"address":"2606:2800:21f:cb07:6820:80da:af6b:8b2c","family":6}]
})
const dns = require('node:dns')
const dnsPromises = dns.promises
const options = {
family: 6,
hints: dns.ADDRCONFIG | dns.V4MAPPED,
}
dnsPromises.lookup('example.org', options).then(result => {
console.log('address: %j family: IPv%s', result.address, result.family)
// address: "2606:2800:21f:cb07:6820:80da:af6b:8b2c" family: IPv6
})
// When options.all is true, the result will be an Array.
options.all = true
dnsPromises.lookup('example.org', options).then(result => {
console.log('addresses: %j', result)
// addresses: [{"address":"2606:2800:21f:cb07:6820:80da:af6b:8b2c","family":6}]
})
dnsPromises.lookupService(address, port)
추가됨: v10.6.0
운영 체제의 기본 getnameinfo
구현을 사용하여 지정된 address
및 port
를 호스트 이름 및 서비스로 확인합니다.
address
가 유효한 IP 주소가 아니면 TypeError
가 발생합니다. port
는 숫자로 강제 변환됩니다. 법적 포트가 아니면 TypeError
가 발생합니다.
오류 발생 시, Promise
는 err.code
가 오류 코드인 Error
객체로 거부됩니다.
import dnsPromises from 'node:dns/promises'
const result = await dnsPromises.lookupService('127.0.0.1', 22)
console.log(result.hostname, result.service) // localhost ssh 출력
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
DNS 프로토콜을 사용하여 호스트 이름(예: 'nodejs.org'
)을 리소스 레코드 배열로 확인합니다. 성공하면 Promise
는 리소스 레코드 배열로 확인됩니다. 개별 결과의 유형과 구조는 rrtype
에 따라 다릅니다.
rrtype | records 포함 내용 | 결과 유형 | 약식 메서드 |
---|---|---|---|
'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() |
오류 발생 시, Promise
는 err.code
가 DNS 오류 코드 중 하나인 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
hostname
<string>
DNS 프로토콜을 사용하여 모든 레코드(ANY
또는 *
쿼리라고도 함)를 확인합니다. 성공하면 Promise
는 다양한 유형의 레코드가 포함된 배열로 해결됩니다. 각 객체에는 현재 레코드의 유형을 나타내는 type
속성이 있습니다. 그리고 type
에 따라 객체에 추가 속성이 있을 수 있습니다.
유형 | 속성 |
---|---|
'A' | address / ttl |
'AAAA' | address / ttl |
'CNAME' | value |
'MX' | dnsPromises.resolveMx() 참조 |
'NAPTR' | dnsPromises.resolveNaptr() 참조 |
'NS' | value |
'PTR' | value |
'SOA' | dnsPromises.resolveSoa() 참조 |
'SRV' | dnsPromises.resolveSrv() 참조 |
'TXT' | dnsPromises.resolveTxt() 를 참조하는 entries 라는 배열 속성을 포함하는 이 레코드 유형, 예: { entries: ['...'], type: 'TXT' } |
결과 객체의 예시는 다음과 같습니다.
;[
{ type: 'A', address: '127.0.0.1', ttl: 299 },
{ type: 'CNAME', value: 'example.com' },
{ type: 'MX', exchange: 'alt4.aspmx.l.example.com', priority: 50 },
{ type: 'NS', value: 'ns1.example.com' },
{ type: 'TXT', entries: ['v=spf1 include:_spf.example.com ~all'] },
{
type: 'SOA',
nsname: 'ns1.example.com',
hostmaster: 'admin.example.com',
serial: 156696742,
refresh: 900,
retry: 900,
expire: 1800,
minttl: 60,
},
]
dnsPromises.resolveCaa(hostname)
추가됨: v15.0.0, v14.17.0
hostname
<string>
DNS 프로토콜을 사용하여 hostname
에 대한 CAA
레코드를 확인합니다. 성공하면, Promise
는 hostname
에 사용 가능한 인증 기관 권한 레코드가 포함된 객체의 배열로 확인됩니다 (예: [{critical: 0, iodef: 'mailto:[email protected]'},{critical: 128, issue: 'pki.example.com'}]
).
dnsPromises.resolveCname(hostname)
추가됨: v10.6.0
hostname
<string>
DNS 프로토콜을 사용하여 hostname
에 대한 CNAME
레코드를 확인합니다. 성공하면, Promise
는 hostname
에 사용 가능한 정규 이름 레코드의 배열로 확인됩니다 (예: ['bar.example.com']
).
dnsPromises.resolveMx(hostname)
추가됨: v10.6.0
hostname
<string>
DNS 프로토콜을 사용하여 hostname
에 대한 메일 교환 레코드(MX
레코드)를 확인합니다. 성공하면, Promise
는 priority
및 exchange
속성을 포함하는 객체의 배열로 확인됩니다 (예: [{priority: 10, exchange: 'mx.example.com'}, ...]
).
dnsPromises.resolveNaptr(hostname)
추가됨: v10.6.0
hostname
<string>
DNS 프로토콜을 사용하여 hostname
에 대한 정규식 기반 레코드(NAPTR
레코드)를 확인합니다. 성공하면, Promise
는 다음 속성을 가진 객체의 배열로 확인됩니다.
flags
service
regexp
replacement
order
preference
{
flags: 's',
service: 'SIP+D2U',
regexp: '',
replacement: '_sip._udp.example.com',
order: 30,
preference: 100
}
dnsPromises.resolveNs(hostname)
추가됨: v10.6.0
hostname
<string>
DNS 프로토콜을 사용하여 hostname
에 대한 이름 서버 레코드(NS
레코드)를 확인합니다. 성공하면, Promise
는 hostname
에 사용 가능한 이름 서버 레코드의 배열로 확인됩니다 (예: ['ns1.example.com', 'ns2.example.com']
).
dnsPromises.resolvePtr(hostname)
추가됨: v10.6.0
hostname
<string>
DNS 프로토콜을 사용하여 hostname
에 대한 포인터 레코드(PTR
레코드)를 확인합니다. 성공하면 Promise
는 응답 레코드가 포함된 문자열 배열로 확인됩니다.
dnsPromises.resolveSoa(hostname)
추가됨: v10.6.0
hostname
<string>
DNS 프로토콜을 사용하여 hostname
에 대한 권한 시작 레코드(SOA
레코드)를 확인합니다. 성공하면 Promise
는 다음 속성을 가진 객체로 확인됩니다.
nsname
hostmaster
serial
refresh
retry
expire
minttl
{
nsname: 'ns.example.com',
hostmaster: 'root.example.com',
serial: 2013101809,
refresh: 10000,
retry: 2400,
expire: 604800,
minttl: 3600
}
dnsPromises.resolveSrv(hostname)
추가됨: v10.6.0
hostname
<string>
DNS 프로토콜을 사용하여 hostname
에 대한 서비스 레코드(SRV
레코드)를 확인합니다. 성공하면 Promise
는 다음 속성을 가진 객체의 배열로 확인됩니다.
priority
weight
port
name
{
priority: 10,
weight: 5,
port: 21223,
name: 'service.example.com'
}
dnsPromises.resolveTxt(hostname)
추가됨: v10.6.0
hostname
<string>
DNS 프로토콜을 사용하여 hostname
에 대한 텍스트 쿼리(TXT
레코드)를 확인합니다. 성공하면 Promise
는 hostname
에 사용 가능한 텍스트 레코드의 2차원 배열로 확인됩니다 (예: [ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]
). 각 하위 배열은 하나의 레코드의 TXT 청크를 포함합니다. 사용 사례에 따라 이러한 청크들을 결합하거나 별도로 처리할 수 있습니다.
dnsPromises.reverse(ip)
추가됨: v10.6.0
ip
<string>
IPv4 또는 IPv6 주소를 호스트 이름 배열로 확인하는 역방향 DNS 쿼리를 수행합니다.
오류 발생 시, Promise
는 Error
객체를 사용하여 거부되며, 여기서 err.code
는 DNS 오류 코드 중 하나입니다.
dnsPromises.setDefaultResultOrder(order)
[히스토리]
버전 | 변경 사항 |
---|---|
v22.1.0, v20.13.0 | ipv6first 값이 지원됩니다. |
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
: 기본order
를ipv4first
로 설정합니다.ipv6first
: 기본order
를ipv6first
로 설정합니다.verbatim
: 기본order
를verbatim
으로 설정합니다.
기본값은 verbatim
이며 dnsPromises.setDefaultResultOrder()
는 --dns-result-order
보다 우선 순위가 높습니다. 워커 스레드를 사용할 때, 메인 스레드의 dnsPromises.setDefaultResultOrder()
는 워커의 기본 dns 순서에 영향을 미치지 않습니다.
dnsPromises.getDefaultResultOrder()
추가됨: v20.1.0, v18.17.0
dnsOrder
의 값을 가져옵니다.
dnsPromises.setServers(servers)
추가됨: v10.6.0
servers
<string[]> RFC 5952 형식의 주소 배열
DNS 확인을 수행할 때 사용할 서버의 IP 주소와 포트를 설정합니다. servers
인수는 RFC 5952 형식의 주소 배열입니다. 포트가 IANA 기본 DNS 포트(53)인 경우 생략할 수 있습니다.
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
의 설정을 사용하지 않습니다.