Read the deepest causeThe outer message identifies the endpoint. DNS, refused TCP, TLS validation, and proxy routing live in the chained cause.
One message. Four boundaries.
ENOTFOUND · EAI_AGAINResolver, VPN, split DNS.
ECONNREFUSED · ETIMEDOUTFirewall, proxy, endpoint.
SELF_SIGNED_CERT_IN_CHAINInspection CA, trust store.
401 · 403 · 429 · 5xxCredential, policy, quota.
Prove Node egress without a key.
Same shellcredential-free fetch
→
fetch('https://api.deepseek.com')Any HTTP statustransport worksDNS + TCP + TLS + proxy reached a server
node -e "fetch('https://api.deepseek.com')
.then(r => console.log('HTTP', r.status))
.catch(e => { console.error(e, e.cause); process.exit(1) })"
Repair the boundary that failed.
NODE_USE_ENV_PROXY=1Feature-test the installed Node minor. Keep localhost in NO_PROXY.
NODE_EXTRA_CA_CERTS=…pemUse the administrator-issued certificate. Restart the Host.
401 ≠ 403 ≠ 429Once a server answered, stop changing proxy and CA settings.
Keep the two connections separate.
fetch failed belongs here.Prove the repaired path.
- ProbeNode reaches HTTP
- Trustno TLS error
- Loopbackstays local
- Modelstreams terminal output
- Restartbehavior persists
Source-backed