npm安装程序抛出ECONNRESET错误,但仅适用于某些软件包

t2a7ltrp  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(297)

我在一个公司代理后面工作。我有如下配置的npm:

$ npm config get

...
https_proxy = "http://proxy.my-domain.com:8080" 
https-proxy = "http://proxy.my-domain.com:8080" 
proxy = "http://proxy.my-domain.com:8080"
...

有了这些设置,我可以很好地安装一些软件包,但不是其他的。例如,$ npm i react工作得很好,而安装@babel/core会引发ECONNRESET错误。

$ npm i @babel/core

npm ERR! code ECONNRESET
npm ERR! syscall read
npm ERR! errno -54
npm ERR! network read ECONNRESET
...

奇怪的是,我可以用yarn安装这个包(为代理配置的方式与npm相同),但它也告诉我有网络问题(即使它成功地安装了这个包🤔)

$ yarn add @babel/core
...
✨  Done in 2.99s.
info There appears to be trouble with your network connection. Retrying...
info There appears to be trouble with your network connection. Retrying...
info There appears to be trouble with your network connection. Retrying...

我不知道为什么它可以用yarn,但不能用npm。

73 silly tarball no local data for @jridgewell/sourcemap-codec@https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz. Extracting by manifest.
74 silly tarball no local data for @jridgewell/trace-mapping@https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz. Extracting by manifest.
75 silly tarball no local data for @jridgewell/set-array@https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz. Extracting by manifest.
76 verbose stack Error: read ECONNRESET
76 verbose stack     at TLSWrap.onStreamRead (node:internal/stream_base_commons:217:20)
77 verbose cwd /Users/justinsmith/Dev/test-npm
78 verbose Darwin 21.4.0
79 verbose node v18.9.0
80 verbose npm  v8.19.1
81 error code ECONNRESET
82 error syscall read
83 error errno -54

有人知道为什么会这样吗?

voase2hg

voase2hg1#

tl;dr将此添加到my ~./npmrc提供了一个临时修复程序:

# This is what I already had set
proxy=http://proxy.my-domain.com:8080/
https-proxy=http://proxy.my-domain.com:8080/
https_proxy=http://proxy.my-domain.com:8080/

# This is what I added
strict-ssl=false
registry=http://registry.npmjs.org/
maxsockets=3

这迫使npm使用http而不是https发出请求,并将并行请求的数量限制为3。
这种方法之所以有效,一个原因是很明显,公司代理在将文件转发给客户端之前,会扫描文件中的恶意软件。很明显,npm通过TLS并行发出太多请求,会使恶意软件扫描程序不堪重负,最终会拒绝一些连接。
另一方面,Yarn会重试几次,而npm只是抛出一个错误并放弃。
一个长期的解决方案是让您的IT部门将npm添加到恶意软件扫描排除列表。
完全归功于这个blog post,它提供了这些有用的解决方案。

相关问题