Skip to content

DNS

[Stable: 2 - Stable]

Stable: 2 Stability: 2 - 安定

ソースコード: 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.setServers()を使用してリゾルバーに使用するサーバーを設定しても、他のリゾルバーには影響しません。

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

[履歴]

バージョン変更
v16.7.0, v14.18.0optionsオブジェクトがtriesオプションを受け入れるようになりました。
v12.18.3コンストラクターがoptionsオブジェクトを受け入れるようになりました。単一のサポートされるオプションは timeout です。
v8.3.0追加: v8.3.0

新しいリゾルバーを作成します。

  • options <Object>
    • timeout <integer> クエリタイムアウト(ミリ秒単位)、またはデフォルトのタイムアウトを使用する場合は -1
    • tries <integer> リゾルバーが各ネームサーバーへの接続を試みる回数。デフォルト: 4

resolver.cancel()

追加: v8.3.0

このリゾルバーによって行われた未解決の DNS クエリをすべてキャンセルします。対応するコールバックは、コード ECANCELLED のエラーで呼び出されます。

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

追加: v15.1.0, v14.17.0

  • ipv4 <string> IPv4 アドレスの文字列表現。デフォルト: '0.0.0.0'
  • ipv6 <string> IPv6 アドレスの文字列表現。デフォルト: '::0'

リゾルバーインスタンスは、指定された IP アドレスからリクエストを送信します。これにより、プログラムはマルチホームシステムで使用する場合にアウトバウンドインターフェースを指定できます。

v4 または v6 アドレスが指定されていない場合、デフォルトに設定され、オペレーティングシステムがローカルアドレスを自動的に選択します。

リゾルバーは、IPv4 DNS サーバーにリクエストを行う場合は v4 ローカルアドレスを使用し、IPv6 DNS サーバーにリクエストを行う場合は v6 ローカルアドレスを使用します。解決リクエストの rrtype は、使用されるローカルアドレスに影響を与えません。

dns.getServers()

追加: v0.11.3

RFC 5952 に従ってフォーマットされた、現在 DNS 解決に構成されている IP アドレス文字列の配列を返します。カスタムポートが使用されている場合、文字列にはポートセクションが含まれます。

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 がスローされるようになりました。
v17.0.0verbatim オプションのデフォルトが true になりました。
v8.5.0verbatim オプションがサポートされるようになりました。
v1.2.0all オプションがサポートされるようになりました。
v0.1.90追加: v0.1.90
  • hostname <string>

  • options <integer> | <Object>

    • family <integer> | <string> レコードファミリ。46、または 0 でなければなりません。後方互換性のため、'IPv4' および 'IPv6' はそれぞれ 4 および 6 として解釈されます。値 0 は、IPv4 または IPv6 アドレスのいずれかが返されることを示します。値 0{ all: true } (下記参照) で使用されている場合、システムの DNS リゾルバーに応じて、IPv4 アドレスと IPv6 アドレスのいずれか、または両方が返されます。デフォルト: 0
    • hints <number> 1 つ以上の サポートされている 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 リゾルバーが返した順序で 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 アドレスでない場合は 00 は、オペレーティングシステムで使用されている名前解決サービスにバグがある可能性が高いことを示します。

ホスト名 (例: 'nodejs.org') を最初に見つかった A (IPv4) または AAAA (IPv6) レコードに解決します。すべての option プロパティはオプションです。options が整数である場合、4 または 6 である必要があります。options が提供されていない場合、IPv4 または IPv6 アドレス、または両方が見つかった場合に返されます。

all オプションが true に設定されている場合、callback の引数は (err, addresses) に変更され、addressesaddress および family プロパティを持つオブジェクトの配列になります。

エラーが発生した場合、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 に設定されていない場合、address および family プロパティを持つ ObjectPromise を返します。

サポートされている getaddrinfo フラグ

[履歴]

バージョン変更点
v13.13.0, v12.17.0dns.ALL フラグのサポートを追加しました。

以下のフラグは、dns.lookup() のヒントとして渡すことができます。

  • dns.ADDRCONFIG: システムに設定されている非ループバックアドレスのタイプに、返されるアドレスタイプを制限します。たとえば、現在のシステムに少なくとも 1 つの IPv4 アドレスが設定されている場合にのみ、IPv4 アドレスが返されます。
  • dns.V4MAPPED: IPv6 ファミリーが指定されたが、IPv6 アドレスが見つからなかった場合、IPv4 マップされた IPv6 アドレスを返します。一部のオペレーティングシステム (例: FreeBSD 10.1) ではサポートされていません。
  • dns.ALL: dns.V4MAPPED が指定されている場合、解決された IPv6 アドレスと IPv4 マップされた IPv6 アドレスを返します。

dns.lookupService(address, port, callback)

[履歴]

バージョン変更点
v18.0.0callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK の代わりに ERR_INVALID_ARG_TYPE がスローされるようになりました。
v0.11.14v0.11.14 で追加されました

与えられた addressport を、オペレーティングシステムの基盤となる getnameinfo 実装を使用してホスト名とサービスに解決します。

address が有効な IP アドレスでない場合、TypeError がスローされます。port は数値に強制変換されます。有効なポートでない場合、TypeError がスローされます。

エラーが発生した場合、errError オブジェクトになり、err.code はエラーコードになります。

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

このメソッドが util.promisify()化されたバージョンとして呼び出される場合、hostname プロパティと service プロパティを持つ ObjectPromise を返します。

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

[履歴]

バージョン変更
v18.0.0callback引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACKではなくERR_INVALID_ARG_TYPEがスローされるようになりました。
v0.1.27v0.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 エラーコードの 1 つになります。

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

[履歴]

バージョン変更点
v18.0.0callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK の代わりに ERR_INVALID_ARG_TYPE をスローするようになりました。
v7.2.0このメソッドは、options、特に options.ttl を渡すことをサポートするようになりました。
v0.1.16追加: v0.1.16
  • hostname <string> 解決するホスト名。

  • options <Object>

    • ttl <boolean> 各レコードの Time-To-Live (TTL) 値を取得します。true の場合、コールバックは文字列の配列ではなく、秒単位で表される TTL を持つ { address: '1.2.3.4', ttl: 60 } オブジェクトの配列を受け取ります。
  • 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)

[履歴]

バージョン変更点
v18.0.0callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK の代わりに ERR_INVALID_ARG_TYPE をスローするようになりました。
v7.2.0このメソッドは、options、特に options.ttl を渡すことをサポートするようになりました。
v0.1.16追加: v0.1.16
  • hostname <string> 解決するホスト名。

  • options <Object>

    • ttl <boolean> 各レコードの Time-To-Live (TTL) 値を取得します。true の場合、コールバックは文字列の配列ではなく、秒単位で表される TTL を持つ { address: '0:1:2:3:4:5:6:7', ttl: 60 } オブジェクトの配列を受け取ります。
  • callback <Function>

DNS プロトコルを使用して、hostname の IPv6 アドレス (AAAA レコード) を解決します。callback 関数に渡される addresses 引数には、IPv6 アドレスの配列が含まれます。

dns.resolveAny(hostname, callback)

[履歴]

バージョン変更
v18.0.0callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK ではなく ERR_INVALID_ARG_TYPE がスローされるようになりました。

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)

[履歴]

バージョン変更
v18.0.0callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK の代わりに ERR_INVALID_ARG_TYPE がスローされるようになりました。
v0.3.2追加: v0.3.2

hostnameCNAME レコードを解決するために DNS プロトコルを使用します。callback 関数に渡される addresses 引数には、hostname で利用可能な正規名レコードの配列が含まれます(例:['bar.example.com'])。

dns.resolveCaa(hostname, callback)

[履歴]

バージョン変更
v18.0.0callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK の代わりに ERR_INVALID_ARG_TYPE がスローされるようになりました。
v15.0.0, v14.17.0追加: v15.0.0, v14.17.0

hostnameCAA レコードを解決するために DNS プロトコルを使用します。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 をスローするようになりました。
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 をスローするようになりました。
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)

[履歴]

バージョン変更点
v18.0.0callback引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACKではなくERR_INVALID_ARG_TYPEをスローするようになりました。
v0.1.90追加: v0.1.90

DNS プロトコルを使用して、hostnameのネームサーバーレコード(NSレコード)を解決します。 callback関数に渡されるaddresses引数には、hostnameで利用可能なネームサーバーレコードの配列(例:['ns1.example.com', 'ns2.example.com'])が含まれます。

dns.resolvePtr(hostname, callback)

[履歴]

バージョン変更点
v18.0.0callback引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACKではなくERR_INVALID_ARG_TYPEをスローするようになりました。
v6.0.0追加: v6.0.0

DNS プロトコルを使用して、hostnameのポインターレコード(PTRレコード)を解決します。 callback関数に渡されるaddresses引数は、応答レコードを含む文字列の配列になります。

dns.resolveSoa(hostname, callback)

[履歴]

バージョン変更点
v18.0.0callback引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACKではなくERR_INVALID_ARG_TYPEをスローするようになりました。
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)

[履歴]

バージョン変更点
v18.0.0callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK の代わりに ERR_INVALID_ARG_TYPE がスローされるようになりました。
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)

[履歴]

バージョン変更点
v18.0.0callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK の代わりに ERR_INVALID_ARG_TYPE がスローされるようになりました。
v0.1.27追加: v0.1.27

DNS プロトコルを使用して、hostname のテキストクエリ (TXT レコード) を解決します。callback 関数に渡される records 引数は、hostname で利用可能なテキストレコードの 2 次元配列です (例: [ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ])。各サブ配列には、1 つのレコードの 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

このリゾルバーによって行われたすべての未解決の 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> レコードファミリ。46、または 0 である必要があります。値 0 は、IPv4 または IPv6 アドレスのいずれかが返されることを示します。値 0{ all: true } (下記参照) と一緒に使用される場合、システムの DNS リゾルバーに応じて、IPv4 アドレスと IPv6 アドレスのいずれか一方または両方が返されます。デフォルト: 0
    • hints <number> 1 つ以上のサポートされている getaddrinfo フラグ。複数のフラグは、それらの値をビット単位で OR することで渡すことができます。
    • all <boolean> true の場合、Promise は配列内のすべてのアドレスで解決されます。それ以外の場合は、単一のアドレスを返します。デフォルト: false
    • order <string> verbatim の場合、Promise は DNS リゾルバーが返した順序で IPv4 アドレスと IPv6 アドレスで解決されます。ipv4first の場合、IPv4 アドレスが IPv6 アドレスの前に配置されます。ipv6first の場合、IPv6 アドレスが IPv4 アドレスの前に配置されます。デフォルト: verbatim (アドレスは並べ替えられません)。デフォルト値は、dns.setDefaultResultOrder() または --dns-result-order を使用して構成できます。新しいコードでは { order: 'verbatim' } を使用する必要があります。
    • verbatim <boolean> true の場合、Promise は DNS リゾルバーが返した順序で 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 で解決されます。

エラーが発生した場合、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
})

// options.all が true の場合、結果は配列になります。
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
})

// options.all が true の場合、結果は配列になります。
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

与えられた addressport を、オペレーティングシステムの基盤となる getnameinfo の実装を使用して、ホスト名とサービスに解決します。

address が有効な IP アドレスでない場合、TypeError がスローされます。port は数値に変換されます。それが有効なポートでない場合、TypeError がスローされます。

エラーが発生した場合、PromiseError オブジェクトで拒否され、err.code はエラーコードになります。

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

console.log(result.hostname, result.service) // Prints: localhost ssh
js
const dnsPromises = require('node:dns').promises
dnsPromises.lookupService('127.0.0.1', 22).then(result => {
  console.log(result.hostname, result.service)
  // Prints: 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()

エラーが発生した場合、PromiseError オブジェクトで拒否され、err.codeDNS エラーコード のいずれかになります。

dnsPromises.resolve4(hostname[, options])

追加: v10.6.0

  • hostname <string> 解決するホスト名。
  • options <Object>
    • ttl <boolean> 各レコードの Time-To-Live (TTL) 値を取得します。true の場合、Promise は文字列の配列ではなく、秒単位で TTL が表された { address: '1.2.3.4', ttl: 60 } オブジェクトの配列で解決されます。

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 の場合、Promise は文字列の配列ではなく、秒単位で TTL が表された { address: '0:1:2:3:4:5:6:7', ttl: 60 } オブジェクトの配列で解決されます。

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 プロトコルを使用して、hostnameCAA レコードを解決します。成功すると、Promise は、hostname で利用可能な認証局認可レコードを含むオブジェクトの配列で解決されます (例: [{critical: 0, iodef: 'mailto:[email protected]'},{critical: 128, issue: 'pki.example.com'}])。

dnsPromises.resolveCname(hostname)

追加: v10.6.0

DNS プロトコルを使用して、hostnameCNAME レコードを解決します。成功すると、Promise は、hostname で利用可能な正規名レコードの配列で解決されます (例: ['bar.example.com'])。

dnsPromises.resolveMx(hostname)

追加: v10.6.0

DNS プロトコルを使用して、hostname のメール交換レコード (MX レコード) を解決します。成功すると、Promise は、priorityexchange プロパティの両方を含むオブジェクトの配列で解決されます (例: [{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 レコード) を解決します。成功すると、Promise は、hostname で利用可能なネームサーバーレコードの配列で解決されます (例: ['ns1.example.com', 'ns2.example.com'])。

dnsPromises.resolvePtr(hostname)

Added in: v10.6.0

DNS プロトコルを使用して、hostname のポインターレコード(PTRレコード)を解決します。成功した場合、Promise は応答レコードを含む文字列の配列で解決されます。

dnsPromises.resolveSoa(hostname)

Added in: 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)

Added in: 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)

Added in: v10.6.0

DNS プロトコルを使用して、hostname のテキストクエリ(TXTレコード)を解決します。成功した場合、Promisehostname で利用可能なテキストレコードの 2 次元配列(例:[ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ])で解決されます。各サブ配列には、1 つのレコードの 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'])

無効なアドレスが指定された場合はエラーがスローされます。

DNS クエリが進行中の間は、dnsPromises.setServers()メソッドを呼び出さないでください。

このメソッドは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 のスレッドプールを使用しません。

結果として、これらの関数は、dns.lookup()が引き起こす可能性がある libuv のスレッドプール上での他の処理に対する負の影響を持つことはありません。

これらの関数は、dns.lookup()が使用する設定ファイルと同じセットを使用しません。たとえば、/etc/hostsの設定を使用しません。