NodeJS与NPM网络异常排查:Kubuntu24、Docker、VirtualBox7环境问题
NPM安装包时ETIMEDOUT错误排查记录
使用nvm 0.40.1、node 22.14.0和npm v10.9.2安装软件包时触发ETIMEDOUT错误,尝试过降级/升级、清理缓存、切换DNS、部署PiHole作为DNS服务器等多种方案,均无效。
自行编写基于require('https')的简单脚本,尝试访问https://registry.npmjs.org(例如https://registry.npmjs.org/data-fns)时,出现大量Aggregate Error:IPv4地址报ETIMEDOUT,IPv6地址报ENETUNREACH。但访问google.com、microsoft.com、docker.com等其他网站完全正常。
环境测试结果
- VirtualBox 7 + Debian 12 + NAT网络:无法正常工作,npm和脚本均出现相同错误
- VirtualBox 7 + Debian 12 + 桥接网络:脚本和
npm install均正常工作 - Docker(测试了v18/20/22多个LTS版本):脚本和
npm install均正常工作
Kubuntu与Debian虚拟机的NPM配置
(Docker环境为默认配置,路径不同但内容相似)
$ npm config ls ; node bin location = /home/USER/.nvm/versions/node/v22.14.0/bin/node ; node version = v22.14.0 ; npm local prefix = /home/USER/works/nodetest ; npm version = 10.9.2 ; cwd = /home/USER/works/nodetest ; HOME = /home/USER ; Run `npm config ls -l` to show all defaults
测试脚本
const https = require('https'); https.get('https://registry.npmjs.org/data-fns', (res) => { console.log('statusCode:', res.statusCode); console.log('headers:', res.headers); const data = []; res.on('data', (d) => { data.push(d); }); res.on('end', ()=>{ const result = data.join("") console.log(result); }); }).on('error', (e) => { console.error(e); });
访问https://registry.npmjs.org的脚本错误信息
(内容已截断,错误会在多个地址重复出现)
AggregateError [ETIMEDOUT]: at internalConnectMultiple (node:net:1139:18) at internalConnectMultiple (node:net:1215:5) at Timeout.internalConnectMultipleTimeout (node:net:1739:5) at listOnTimeout (node:internal/timers:596:11) at process.processTimers (node:internal/timers:529:7) { code: 'ETIMEDOUT', [errors]: [ Error: connect ETIMEDOUT 104.16.3.35:443 at createConnectionError (node:net:1675:14) at Timeout.internalConnectMultipleTimeout (node:net:1734:38) at listOnTimeout (node:internal/timers:596:11) at process.processTimers (node:internal/timers:529:7) { errno: -110, code: 'ETIMEDOUT', syscall: 'connect', address: '104.16.3.35', port: 443 }, Error: connect ENETUNREACH 2606:4700::6810:1f22:443 - Local (:::0) at internalConnectMultiple (node:net:1211:16) at Timeout.internalConnectMultipleTimeout (node:net:1739:5) at listOnTimeout (node:internal/timers:596:11) at process.processTimers (node:internal/timers:529:7) { errno: -101, code: 'ENETUNREACH', syscall: 'connect', address: '2606:4700::6810:1f22', port: 443 }, ...
内容的提问来源于stack exchange,提问作者Vemman
相关产品推荐
相关产品推荐

