npm 有独立的 proxy 和 https-proxy 设置。区分的是请求的目标。对于通过隧道承载 HTTPS 的普通 HTTP 代理,两者都可以指向同一个 http:// 端点。

项目级 .npmrc 可以包含:

proxy=http://203.0.113.10:8080
https-proxy=http://203.0.113.10:8080
noproxy=localhost,127.0.0.1,registry.example.internal

将文档示例端点替换为你的代理;进行获准的公共 registry 测试时,HTTP 代理列表可提供 HTTP 候选。最后一行有意让指定的内部 registry 直连,它不是另一个代理地址。

让 npm 发起请求

利用缓存完成的安装不适合测试路由:npm 可能已经有所需的全部内容。registry ping 是更小的检查:

npm ping --registry=https://registry.npmjs.org/

成功完成说明这次 npm 调用到达了该 registry 路径,并不能证明所有 tarball 主机、Git 依赖或独立的包管理器进程都使用同一路径。

定位冲突设置时,先检查实际生效的值,不要马上修改更多文件:

npm config get proxy
npm config get https-proxy
npm config get noproxy

如果 URL 中嵌入了凭据,这些命令可能将其打印出来。请在本地检查输出,不要原样粘贴到问题报告中。

项目 .npmrc 不用于全局安装。如果只有 npm install -g 失败,就检查该次调用的有效配置,不要假定它读取了项目文件。

更换 IP 前先检查排除项

npm 也使用代理环境变量,noproxy 设置可能来自 NO_PROXY。被有效配置排除的目标,即使存在代理值,也可能直连。反过来,从某个 .npmrc 删除一行,并不会清除继承的环境变量。

将证书错误分开处理

获准的流量检查代理可能需要组织 CA,而你的 Node/npm 配置尚未信任它。npm 支持 CA 文件:

cafile=/path/to/approved-ca-bundle.pem
strict-ssl=true

使用该环境实际批准的证书包。设置 strict-ssl=false 会削弱证书验证,不能代替选择正确代理或信任材料。

测试结束后,移除你添加的项目覆盖配置,再检查有效值。这样项目可以继承之前的配置,而不改动同一机器上的其他项目。

相关文章