What This Error Means
npm could not resolve the registry hostname (DNS returned ENOTFOUND).
How to Fix It
- Check which registry npm is using:
npm config get registry. - If the package is scoped, verify scope registry mapping in
.npmrc(example:@your-scope:registry=...). - Run a quick health check:
npm ping. - Confirm basic HTTPS connectivity from the same machine:
curl -I $(npm config get registry). - If you use a proxy, verify settings:
npm config get proxyandnpm config get https-proxy. - If you do not use a proxy, remove stale proxy config:
npm config delete proxyandnpm config delete https-proxy. - Resolve the registry host (DNS):
node -e "require(\"dns\").lookup(new URL(process.argv[1]).hostname, console.log)" $(npm config get registry). - If this works on a different network (hotspot) but fails on your office/VPN, fix DNS/VPN/proxy first.
- Retry with logs:
npm --verbose(keep the full output). - If this happens in CI only, compare DNS/proxy/firewall between CI and your local machine.
Why It Happens
- DNS is unstable or blocked on your network (VPN, captive portal, split-DNS, or firewall).
- A proxy is misconfigured (wrong
proxy/https-proxy), or a corporate proxy is blocking npm traffic. - The registry endpoint is temporarily down or rate-limiting requests.
How to Verify
- Run
npm pingand confirm it succeeds. - Re-run the original command and confirm downloads complete without timeouts/resets.
Manual connectivity checks
- Resolve the registry host:
node -e "require(\"dns\").lookup(new URL(process.argv[1]).hostname, console.log)" $(npm config get registry). - Check TLS+HTTP from the same machine:
curl -v $(npm config get registry). - If behind a proxy, confirm it is used only when intended and supports HTTPS CONNECT.
Common CLI Output
npm ERR! code ENOTFOUNDnpm ERR! errno ENOTFOUNDnpm ERR! getaddrinfo ENOTFOUND registry.npmjs.org How npm talks to registries
- npm fetches package metadata and tarballs over HTTPS from your configured registry.
- Failures can happen during DNS lookup, TCP connect, TLS handshake, or while streaming the tarball.
- Proxy configuration (
proxy/https-proxy) changes the network path and is a common root cause.
Prevention Tips
- Use a proxy/cache registry close to your CI runners to reduce upstream variance.
- Avoid flaky DNS by using stable resolvers in CI and on build machines.
- Pin Node/npm versions in CI so network behavior is consistent.
Where This Can Be Triggered
github.com/npm/cli/blob/417daa72b09c5129e7390cd12743ef31bf3ddb83/lib/utils/ping.js
This is the registry request path where npm talks to the network. DNS/TLS errors like this code are raised by Node/OS during this request. - GitHub
// used by the ping and doctor commands
const npmFetch = require('npm-registry-fetch')
module.exports = async (flatOptions) => {
const res = await npmFetch('/-/ping', { ...flatOptions, cache: false })
return res.json().catch(() => ({}))
}