When Node.js Ignores Public DNS And Falls Back
Node.js developers on Windows often expect dns.getServers() to reflect the system’s active DNS - like 8.8.8.8 - but instead, it stubbornly returns ['127.0.0.1'], even after flushing local caches and resetting network settings. This bug isn’t a feature; it’s a misalignment between Node’s internal DNS resolver and the OS-level configuration.
Here’s the hard truth: The method pulls from the system’s configured DNS, but many Windows setups default to localhost as a fallback - especially on systems with proxy layers or legacy DNS layers. Even after clearing virtual adapters and setting Interface Metric to 1 on Wi-Fi, Node clings to 127.0.0.1.
Why does this matter? DNS isn’t just about getting online - it’s about trust. When a Node app reports DNS as loopback, it undermines network diagnostics, breaks service discovery, and confuses monitoring tools. This isn’t a minor glitch; it’s a gap in how Node treats OS-level DNS priorities.
But here’s the hidden angle: most users assume dns.getServers() is a direct mirror of system settings, yet Windows often layers local DNS behavior that Node can’t bypass with basic nslookup or dnsconfig. It’s not a bug in Node itself, but a mismatch in expectations.
Here’s the elephant in the room: clearing WSL2 adapters, ipconfig /flushdns, and resetting network stacks did nothing. The loopback trap persists. This demands a shift in how developers verify DNS - by cross-checking via nslookup or dig on the host, not just getServers().
Still, you can mitigate: force DNS resolution with dns.resolver from Node’s native API or use dns.getServers() alongside dns.getOptions() to inspect the source. But know: the root cause lies in OS DNS behavior, not Node’s logic.
When your Node app says DNS is localhost - what does that really mean? Are you truly connected, or just pretending?