| # DNS |
| |
| Stability: 2 - Stable |
| |
| The `dns` module contains functions belonging to two different categories: |
| |
| 1) Functions that use the underlying operating system facilities to perform |
| name resolution, and that do not necessarily perform any network communication. |
| This category contains only one function: [`dns.lookup()`][]. __Developers |
| looking to perform name resolution in the same way that other applications on |
| the same operating system behave should use [`dns.lookup()`][].__ |
| |
| For example, looking up `nodejs.org`. |
| |
| const dns = require('dns'); |
| |
| dns.lookup('nodejs.org', (err, addresses, family) => { |
| console.log('addresses:', addresses); |
| }); |
| |
| 2) Functions that connect to an actual DNS server to perform name resolution, |
| and that _always_ use the network to perform DNS queries. This category |
| contains all functions in the `dns` module _except_ [`dns.lookup()`][]. These |
| functions do not use the same set of configuration files used by |
| [`dns.lookup()`][] (e.g. `/etc/hosts`). These functions should be used by |
| developers who do not want to use the underlying operating system's facilities |
| for name resolution, and instead want to _always_ perform DNS queries. |
| |
| Below is an example that resolves `'nodejs.org'` then reverse resolves the IP |
| addresses that are returned. |
| |
| const dns = require('dns'); |
| |
| dns.resolve4('nodejs.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)}`); |
| }); |
| }); |
| }); |
| |
| There are subtle consequences in choosing one over the other, please consult |
| the [Implementation considerations section][] for more information. |
| |
| ## dns.getServers() |
| |
| Returns an array of IP address strings that are being used for name |
| resolution. |
| |
| ## dns.lookup(hostname[, options], callback) |
| |
| Resolves a hostname (e.g. `'nodejs.org'`) into the first found A (IPv4) or |
| AAAA (IPv6) record. `options` can be an object or integer. If `options` is |
| not provided, then IPv4 and IPv6 addresses are both valid. If `options` is |
| an integer, then it must be `4` or `6`. |
| |
| Alternatively, `options` can be an object containing these properties: |
| |
| * `family` {Number} - The record family. If present, must be the integer |
| `4` or `6`. If not provided, both IP v4 and v6 addresses are accepted. |
| * `hints`: {Number} - If present, it should be one or more of the supported |
| `getaddrinfo` flags. If `hints` is not provided, then no flags are passed to |
| `getaddrinfo`. Multiple flags can be passed through `hints` by logically |
| `OR`ing their values. |
| See [supported `getaddrinfo` flags][] below for more information on supported |
| flags. |
| * `all`: {Boolean} - When `true`, the callback returns all resolved addresses |
| in an array, otherwise returns a single address. Defaults to `false`. |
| |
| All properties are optional. An example usage of options is shown below. |
| |
| { |
| family: 4, |
| hints: dns.ADDRCONFIG | dns.V4MAPPED, |
| all: false |
| } |
| |
| The `callback` function has arguments `(err, address, family)`. `address` is a |
| string representation of an IPv4 or IPv6 address. `family` is either the |
| integer `4` or `6` and denotes the family of `address` (not necessarily the |
| value initially passed to `lookup`). |
| |
| With the `all` option set to `true`, the arguments change to |
| `(err, addresses)`, with `addresses` being an array of objects with the |
| properties `address` and `family`. |
| |
| On error, `err` is an [`Error`][] object, where `err.code` is the error code. |
| Keep in mind that `err.code` will be set to `'ENOENT'` not only when |
| the hostname does not exist but also when the lookup fails in other ways |
| such as no available file descriptors. |
| |
| `dns.lookup()` does not necessarily have anything to do with the DNS protocol. |
| The implementation uses an operating system facility that can associate names |
| with addresses, and vice versa. This implementation can have subtle but |
| important consequences on the behavior of any Node.js program. Please take some |
| time to consult the [Implementation considerations section][] before using |
| `dns.lookup()`. |
| |
| ### Supported getaddrinfo flags |
| |
| The following flags can be passed as hints to [`dns.lookup()`][]. |
| |
| - `dns.ADDRCONFIG`: Returned address types are determined by the types |
| of addresses supported by the current system. For example, IPv4 addresses |
| are only returned if the current system has at least one IPv4 address |
| configured. Loopback addresses are not considered. |
| - `dns.V4MAPPED`: If the IPv6 family was specified, but no IPv6 addresses were |
| found, then return IPv4 mapped IPv6 addresses. Note that it is not supported |
| on some operating systems (e.g FreeBSD 10.1). |
| |
| ## dns.lookupService(address, port, callback) |
| |
| Resolves the given `address` and `port` into a hostname and service using |
| the operating system's underlying `getnameinfo` implementation. |
| |
| The callback has arguments `(err, hostname, service)`. The `hostname` and |
| `service` arguments are strings (e.g. `'localhost'` and `'http'` respectively). |
| |
| On error, `err` is an [`Error`][] object, where `err.code` is the error code. |
| |
| const dns = require('dns'); |
| dns.lookupService('127.0.0.1', 22, (err, hostname, service) => { |
| console.log(hostname, service); |
| // Prints: localhost ssh |
| }); |
| |
| ## dns.resolve(hostname[, rrtype], callback) |
| |
| Uses the DNS protocol to resolve a hostname (e.g. `'nodejs.org'`) into an |
| array of the record types specified by `rrtype`. |
| |
| Valid values for `rrtype` are: |
| |
| * `'A'` - IPV4 addresses, default |
| * `'AAAA'` - IPV6 addresses |
| * `'MX'` - mail exchange records |
| * `'TXT'` - text records |
| * `'SRV'` - SRV records |
| * `'PTR'` - used for reverse IP lookups |
| * `'NS'` - name server records |
| * `'CNAME'` - canonical name records |
| * `'SOA'` - start of authority record |
| |
| The `callback` function has arguments `(err, addresses)`. When successful, |
| `addresses` will be an array. The type of each item in `addresses` is |
| determined by the record type, and described in the documentation for the |
| corresponding lookup methods below. |
| |
| On error, `err` is an [`Error`][] object, where `err.code` is |
| one of the error codes listed below. |
| |
| ## dns.resolve4(hostname, callback) |
| |
| Uses the DNS protocol to resolve a IPv4 addresses (`A` records) for the |
| `hostname`. The `addresses` argument passed to the `callback` function |
| will contain an array of IPv4 addresses (e.g. |
| `['74.125.79.104', '74.125.79.105', '74.125.79.106']`). |
| |
| ## dns.resolve6(hostname, callback) |
| |
| Uses the DNS protocol to resolve a IPv6 addresses (`AAAA` records) for the |
| `hostname`. The `addresses` argument passed to the `callback` function |
| will contain an array of IPv6 addresses. |
| |
| ## dns.resolveCname(hostname, callback) |
| |
| Uses the DNS protocol to resolve `CNAME` records for the `hostname`. The |
| `addresses` argument passed to the `callback` function |
| will contain an of canonical name records available for the `hostname` |
| (e.g. `['bar.example.com']`). |
| |
| ## dns.resolveMx(hostname, callback) |
| |
| Uses the DNS protocol to resolve mail exchange records (`MX` records) for the |
| `hostname`. The `addresses` argument passed to the `callback` function will |
| contain an array of objects containing both a `priority` and `exchange` |
| property (e.g. `[{priority: 10, exchange: 'mx.example.com'}, ...]`). |
| |
| ## dns.resolveNs(hostname, callback) |
| |
| Uses the DNS protocol to resolve name server records (`NS` records) for the |
| `hostname`. The `addresses` argument passed to the `callback` function will |
| contain an array of name server records available for `hostname` |
| (e.g., `['ns1.example.com', 'ns2.example.com']`). |
| |
| ## dns.resolveSoa(hostname, callback) |
| |
| Uses the DNS protocol to resolve a start of authority record (`SOA` record) for |
| the `hostname`. The `addresses` argument passed to the `callback` function will |
| be an object with the following properties: |
| |
| * `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) |
| |
| Uses the DNS protocol to resolve service records (`SRV` records) for the |
| `hostname`. The `addresses` argument passed to the `callback` function will |
| be an array of objects with the following properties: |
| |
| * `priority` |
| * `weight` |
| * `port` |
| * `name` |
| |
| { |
| priority: 10, |
| weight: 5, |
| port: 21223, |
| name: 'service.example.com' |
| } |
| |
| ## dns.resolveTxt(hostname, callback) |
| |
| Uses the DNS protocol to resolve text queries (`TXT` records) for the |
| `hostname`. The `addresses` argument passed to the `callback` function is |
| is a two-dimentional array of the text records available for `hostname` (e.g., |
| `[ ['v=spf1 ip4:0.0.0.0 ', '~all' ] ]`). Each sub-array contains TXT chunks of |
| one record. Depending on the use case, these could be either joined together or |
| treated separately. |
| |
| ## dns.reverse(ip, callback) |
| |
| Performs a reverse DNS query that resolves an IPv4 or IPv6 address to an |
| array of hostnames. |
| |
| The `callback` function has arguments `(err, hostnames)`, where `hostnames` |
| is an array of resolved hostnames for the given `ip`. |
| |
| On error, `err` is an [`Error`][] object, where `err.code` is |
| one of the error codes listed below. |
| |
| ## dns.setServers(servers) |
| |
| Sets the IP addresses of the servers to be used when resolving. The `servers` |
| argument is an array of IPv4 or IPv6 addresses. |
| |
| If a port specified on the address it will be removed. |
| |
| An error will be thrown if an invalid address is provided. |
| |
| The `dns.setServers()` method must not be called while a DNS query is in |
| progress. |
| |
| ## Error codes |
| |
| Each DNS query can return one of the following error codes: |
| |
| - `dns.NODATA`: DNS server returned answer with no data. |
| - `dns.FORMERR`: DNS server claims query was misformatted. |
| - `dns.SERVFAIL`: DNS server returned general failure. |
| - `dns.NOTFOUND`: Domain name not found. |
| - `dns.NOTIMP`: DNS server does not implement requested operation. |
| - `dns.REFUSED`: DNS server refused query. |
| - `dns.BADQUERY`: Misformatted DNS query. |
| - `dns.BADNAME`: Misformatted hostname. |
| - `dns.BADFAMILY`: Unsupported address family. |
| - `dns.BADRESP`: Misformatted DNS reply. |
| - `dns.CONNREFUSED`: Could not contact DNS servers. |
| - `dns.TIMEOUT`: Timeout while contacting DNS servers. |
| - `dns.EOF`: End of file. |
| - `dns.FILE`: Error reading file. |
| - `dns.NOMEM`: Out of memory. |
| - `dns.DESTRUCTION`: Channel is being destroyed. |
| - `dns.BADSTR`: Misformatted string. |
| - `dns.BADFLAGS`: Illegal flags specified. |
| - `dns.NONAME`: Given hostname is not numeric. |
| - `dns.BADHINTS`: Illegal hints flags specified. |
| - `dns.NOTINITIALIZED`: c-ares library initialization not yet performed. |
| - `dns.LOADIPHLPAPI`: Error loading iphlpapi.dll. |
| - `dns.ADDRGETNETWORKPARAMS`: Could not find GetNetworkParams function. |
| - `dns.CANCELLED`: DNS query cancelled. |
| |
| ## Implementation considerations |
| |
| Although [`dns.lookup()`][] and the various `dns.resolve*()/dns.reverse()` |
| functions have the same goal of associating a network name with a network |
| address (or vice versa), their behavior is quite different. These differences |
| can have subtle but significant consequences on the behavior of Node.js |
| programs. |
| |
| ### `dns.lookup()` |
| |
| Under the hood, [`dns.lookup()`][] uses the same operating system facilities |
| as most other programs. For instance, [`dns.lookup()`][] will almost always |
| resolve a given name the same way as the `ping` command. On most POSIX-like |
| operating systems, the behavior of the [`dns.lookup()`][] function can be |
| modified by changing settings in `nsswitch.conf(5)` and/or `resolv.conf(5)`, |
| but note that changing these files will change the behavior of _all other |
| programs running on the same operating system_. |
| |
| Though the call to `dns.lookup()` will be asynchronous from JavaScript's |
| perspective, it is implemented as a synchronous call to `getaddrinfo(3)` that |
| runs on libuv's threadpool. Because libuv's threadpool has a fixed size, it |
| means that if for whatever reason the call to `getaddrinfo(3)` takes a long |
| time, other operations that could run on libuv's threadpool (such as filesystem |
| operations) will experience degraded performance. In order to mitigate this |
| issue, one potential solution is to increase the size of libuv's threadpool by |
| setting the `'UV_THREADPOOL_SIZE'` environment variable to a value greater than |
| `4` (its current default value). For more information on libuv's threadpool, see |
| [the official libuv documentation][]. |
| |
| ### `dns.resolve()`, `dns.resolve*()` and `dns.reverse()` |
| |
| These functions are implemented quite differently than [`dns.lookup()`][]. They |
| do not use `getaddrinfo(3)` and they _always_ perform a DNS query on the |
| network. This network communication is always done asynchronously, and does not |
| use libuv's threadpool. |
| |
| As a result, these functions cannot have the same negative impact on other |
| processing that happens on libuv's threadpool that [`dns.lookup()`][] can have. |
| |
| They do not use the same set of configuration files than what [`dns.lookup()`][] |
| uses. For instance, _they do not use the configuration from `/etc/hosts`_. |
| |
| [`dns.lookup()`]: #dns_dns_lookup_hostname_options_callback |
| [`dns.resolve()`]: #dns_dns_resolve_hostname_rrtype_callback |
| [`dns.resolve4()`]: #dns_dns_resolve4_hostname_callback |
| [`Error`]: errors.html#errors_class_error |
| [Implementation considerations section]: #dns_implementation_considerations |
| [supported `getaddrinfo` flags]: #dns_supported_getaddrinfo_flags |
| [the official libuv documentation]: http://docs.libuv.org/en/latest/threadpool.html |