问题复现
在搭建初期,将config/index.js
中的registryHost
配置项设置为'127.0.0.1:7001'
然后测试时发现本地安装包正常,但其他客户机安装包会报错如下:
npm ERR! code ECONNREFUSED
npm ERR! syscall connect
npm ERR! errno ECONNREFUSED
npm ERR! FetchError: request to http://127.0.0.1:7001/@test-scp/test-pkg/download/@test-scp/test-pkg-1.0.0.tgz failed, reason: connect ECONNREFUSED 127.0.0.1:7001
...
因此,将config/index.js
中的registryHost
配置项设置为'registry.xxx.org'
,即改为Nginx
反向代理后的注册服务器名。重启cnpmjs服务后再次在其他客户机上测试安装包。但可惜,报错依旧。
排查方法
进一步排查npm缓存日志(存放在C:\Users\Administrator\AppData\Local\npm-cache\_logs
):
...
33 http fetch GET 200 http://registry.xxx.org/@test-scp%2ftest-pkg 216ms (cache revalidated)
...
注意到这一行最后的cache revalidated
,意味着就算改了registryHost
并重启了服务,但安装之前的@test-scp/test-pkg
包时还是会获取到之前的缓存。可以在浏览器中手动请求一下并从返回的JSON中找到tarball
属性:
...
"tarball":"http://127.0.0.1:7001/@test-scp/test-pkg/download/@test-scp/test-pkg-1.0.0.tgz"
...
果然,这里返回的JSON还是修改registryHost
并重启服务之前的缓存,所以仍然会报之前的错误,造成了一种修改registryHost
不生效的假象。
解决方案
既然存在缓存这种东西,心思应该是有可配置选项的。在config/index.js
中找到了一个registryCacheControlHeader
配置项,注释描述为:
// registry http response cache control header
// if you are using CDN, can set it to 'max-age=0, s-maxage=10, must-revalidate'
// it meaning cache 10s on CDN server and no cache on client side.
但奇怪的是并没有使用CDN,该项也维持着默认值:’’
换个思路,只要将缓存更新就能够通过测试。因此,不如直接发布一版新的@test-scp/test-pkg
包(手动滑稽)。注意,发布之前需要改动包的版本号才能发布成功:
- 当要发补丁版时可运行命令:`npm version patch`
- 当要发小版本时可运行命令:`npm version minor`
- 当要发大版本时可运行命令:`npm version major`
当然,手动改package.json
中的版本号应该也可以
登录之后再npm publish
就行。这样将缓存更新之后再在其他客户机上测试安装@test-scp/test-pkg
包就可以成功了,也就是说修改registryHost
实际上是生效的(废话,手动滑稽)。