尝试安装任何模块时出现“无法从注册表获取消息”的错误。

364

我无法从npm安装任何Node模块。

npm install socket.io

以上命令的执行结果如下,无法安装socket.io。

npm http GET https://registry.npmjs.org/socket.io

npm ERR! Error: failed to fetch from registry: socket.io
npm ERR!     at /opt/node0610/lib/node_modules/npm/lib/utils/npm-registry-client/get.js:139:12
npm ERR!     at cb (/opt/node0610/lib/node_modules/npm/lib/utils/npm-registry-client/request.js:32:9)
npm ERR!     at Request._callback (/opt/node0610/lib/node_modules/npm/lib/utils/npm-registry-client/request.js:137:18)
npm ERR!     at Request.callback (/opt/node0610/lib/node_modules/npm/node_modules/request/main.js:109:22)
npm ERR!     at Request.<anonymous> (/opt/node0610/lib/node_modules/npm/node_modules/request/main.js:198:58)
npm ERR!     at Request.emit (events.js:88:20)
npm ERR!     at ClientRequest.<anonymous> (/opt/node0610/lib/node_modules/npm/node_modules/request/main.js:195:10)
npm ERR!     at ClientRequest.emit (events.js:67:17)
npm ERR!     at CleartextStream.<anonymous> (http.js:1134:11)
npm ERR!     at CleartextStream.emit (events.js:67:17)
npm ERR! You may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>
npm ERR! 
npm ERR! System Linux 2.6.18-194.el5
npm ERR! command "node" "/opt/node0610/bin/npm" "install" "socket.io"
npm ERR! cwd /opt/node0610/lib/node_modules
npm ERR! node -v v0.6.10
npm ERR! npm -v 1.1.0-3
npm ERR! message failed to fetch from registry: socket.io
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /opt/node0610/lib/node_modules/npm-debug.log
npm not ok

我的 NPM 版本是:

[applmgr@dev node_modules]$ npm --version
1.1.0-3

我的 NodeJS 版本是:

[applmgr@dev node_modules]$ node --version
v0.6.10

12
这是一个相当古老的 npm 版本。请将其更新为最新版本,然后再尝试: sudo npm update npm -g - JohnnyHK
1
Johny,谢谢你的评论。实际上,如果我需要更新 npm,我也应该更新 nodejs 吗? - Dexter
1
你不必更新nodejs,但如果没有特殊原因限制你使用6.x版本的话,我建议你更新。 - JohnnyHK
HTTP可行;而HTTPS不行,因为registry.npmjs.org没有监听HTTPS。 - Mark
1
我通常从官网下载并编译最新版本的nodejs。我使用的发行版(通常是Ubuntu LTS)版本太旧了。 - Alex Lokk
显示剩余2条评论
15个回答

804

我曾经在使用npm v1.1.4(和node v0.6.12)时遇到了问题,它们是Ubuntu 12.04仓库版本。

看起来这个版本的npm已经不再受支持,更新node(并随之更新npm)即可解决问题。

首先,卸载过时版本(可选,但我认为这解决了我在全局模块中找不到路径的问题)。

sudo apt-get purge nodejs npm

然后启用nodesource存储库并安装:

curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install -y nodejs

注意 - 以前的建议是使用Chris Lea的仓库,他现在将其迁移到了nodesource,请参见:

来自:这里


13
请注意,nodejs软件包包括npm和nodejs-dev,因此从ppa安装nodejs即可获取npm所需的一切内容。 - chawkinsuf
2
谢谢!这对我有用!这将是“Ask Ubuntu”的被接受答案,但似乎很多非Ubuntu用户也发现被接受的答案很有帮助。 - dannyman
2
在树莓派上运行时,运行nodejs或npm时出现了分段错误。 - godzilla
5
使用这些指示后,在树莓派(Raspbian)上出现分段错误,我移除了端口并按照这些指示进行操作https://gist.github.com/justinjenkins/16adc15338bb265f6808,现在它能工作了! - Justin Jenkins
2
-1 是不明智和不安全的建议,建议新手从互联网上的未经验证的源代码管道到根 shell。这种行为极其不负责任。如果不是建议验证校验和,至少应该有一个关于安全性的警告。 - sorpigal
显示剩余10条评论

651

https://github.com/isaacs/npm/issues/2119

我不得不执行下面的命令:

npm config set registry http://registry.npmjs.org/

然而,这将使 npm 在不安全的 HTTP 连接上安装软件包。如果可以的话,您应该坚持使用

npm config set registry https://registry.npmjs.org/

应该使用HTTPS安装,而不是覆盖安装。


6
是的,这对我也有帮助。谢谢分享! - Alix Axel
7
使用树莓派,我需要使用相同的命令。将 https://registry.npmjs.org/pi-gpio 改为 http://registry.npmjs.org/pi-gpio。不确定为什么 pi 无法访问 https。 - Jdahern
28
警告:这将通过一个不安全的连接拉取资源。在您获得这些文件之前,它们可能已经被更改。再次强调:这是不安全的。 - Lodewijk
38
即使它能够工作,请不要使用此不安全的解决方案。使用 apt-get 安装的 Node.js 版本过旧(0.6.12);我从 GitHub 安装了最新的稳定版本,并解决了问题。 - Louis Ameline
2
它对于其他一些Node.js包不起作用。我只是从官方网站下载了更新版本的Node.js,并手动编译它。 - Alex Lokk
显示剩余10条评论

32

我使用的是Ubuntu系统。我使用了apt-get命令安装了node.js,但npm并没有包含在这个软件包中,所以我需要另外单独安装npm。我原以为这样就可以了,但结果发现Ubuntu系统中预先安装的npm版本已经过时了。

wiki上给出了如下指示:

获取最新版本的Node或在旧版Ubuntu及其他基于apt的发行版上进行安装可能需要额外步骤。下面是一个安装示例:

sudo apt-get update
sudo apt-get install -y python-software-properties python g++ make
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs

之后,npm已经包含在内并且运行得非常完美。


19

对我来说,通常是代理问题,我会尝试一切:

npm config set registry http://registry.npmjs.org/
npm config set strict-ssl false

npm config set proxy http://myusername:mypassword@proxy.us.somecompany:8080
npm config set https-proxy http://myusername:mypassword@proxy.us.somecompany:8080
set HTTPS_PROXY=http://myusername:mypassword@proxy.us.somecompany:8080
set HTTP_PROXY=http://myusername:mypassword@proxy.us.somecompany:8080
export HTTPS_PROXY=http://myusername:mypassword@proxy.us.somecompany:8080
export HTTP_PROXY=http://myusername:mypassword@proxy.us.somecompany:8080
export http_proxy=http://myusername:mypassword@proxy.us.somecompany:8080

npm --proxy http://myusername:mypassword@proxy.us.somecompany:8080 \
--without-ssl --insecure -g install

4
通过使用“npm config set strict-ssl false”禁用严格的SSL对我起作用了。 - Mayura

17

您还需要安装software-properties-common软件包,以使add-apt-repository命令正常工作。

sudo apt-get purge nodejs npm
sudo apt-get install -y python-software-properties python g++ make software-properties-common
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs

3
在执行以上步骤后,我们需要做的就是:sudo npm install -g karma。 - vijay

10

对于出现随机npm安装错误的情况(在相同环境下不同时间会出现不同的错误包),我发现一种方法是使用以下命令:

npm cache clean

然后重复安装流程。这样看起来流程会更加顺畅,真正的问题和错误消息也会浮现出来,您可以进行修复然后继续操作。

这是基于在Docker实例中运行Ubuntu裸机安装大量npm软件包的经验。有时,从Ubuntu缺少构建/编译工具,导致npm错误不会显示真正的问题,除非你清空缓存。


是的,我发现我必须与therefromhere的答案一起运行此程序。 - John Powell

7
这个问题是由于https协议引起的,这就是为什么其他解决方案有效的原因(通过切换到非安全协议)。
对我来说,最好的解决方案是编译最新版本的Node,其中包括npm。
apt-get purge nodejs npm
git clone https://github.com/nodejs/node ~/local/node
cd ~/local/node
./configure
make
make install

6

现在有来自 Joyent(Node.js 的主要支持者)的官方说明。对于 Ubuntu:

sudo apt-get purge nodejs npm
curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install -y nodejs

对于其他的Unix发行版、OSX和Windows,请查看链接。请注意,这将安装Node和npm。


5
在基于Ubuntu的操作系统Elementary OS Luna上,我尝试了所有的方法,但唯一有效的方法是从源代码安装。我的电脑是x86架构。请注意,不要在包管理器中安装它。
sudo apt-get purge nodejs npm -y

我去下载页面查看了最新源码并下载了它,http://nodejs.org/download/。您可以使用curl、wget或您的浏览器来获取它:

wget http://nodejs.org/dist/v0.10.34/node-v0.10.34.tar.gz
tar -xvf node-v0.10.34.tar.gz 
cd node-v0.10.34
./configure
make
sudo make install

编译可能需要一些时间。完成后,您应该在/usr/local/bin目录中安装并启用了node和npm,并且该目录已经在您的路径上。您应该验证其位置:

which npm node

我还必须更改权限才能使其正常工作:

sudo chown -R $USER /usr/local

如果不起作用,请检查您的路径:
echo $PATH

请注意,以这种方式安装,它将不受apt-get软件包管理器的管理。干杯!

请分享问题是什么,而不是将其标记下来。它在我这里能正常运行! :) - radtek

3

最近我在将node.js(以及不可避免的npm)升级到最新版本后遇到了这个问题:

> npm --version < 2.0.0-alpha-5

注意:我没有要求使用不稳定版本,只是在OSX上运行brew install npm后得到了它。

降级npm对我解决了这个问题。

安装稳定版npm的最简单方法是npm install -g npm,但在某些情况下可能无法正常工作,此时需要降级node.js。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接