有没有办法使npm install(命令)在代理后面工作?


266

了解.npmrc文件中的代理变量,但它不起作用。尝试避免手动下载所有必需的软件包并进行安装。

Answers:


343

我这样解决了这个问题:

  1. 我运行以下命令:

    npm config set strict-ssl false
  2. 然后将npm设置为使用http而不是https运行:

    npm config set registry "http://registry.npmjs.org/"
  3. 然后,我使用以下语法安装软件包:

    npm --proxy http://username:password@cacheaddress.com.br:80 install packagename

username:password如果代理不需要您进行身份验证,请跳过该部分

编辑:我的一个朋友刚刚指出的是,你可以通过设置让NPM背后的代理工作BOTH HTTP_PROXY和HTTPS_PROXY环境变量,然后正常发出命令 故宫安装快车(例如)

EDIT2:正如@BStruthers所评论的那样,请记住,如果包含@,则不能正确地解析包含“ @”的密码,如果使用@将整个密码放在引号中


7
请注意,如果您的密码包含“ @”,npm将无法正确解析您的代理设置。可能的解决方法是在npm配置中放入假的username:password,然后使用本地代理(例如fiddler)来修改请求的Proxy-Authorization标头,使其具有正确的username:password。请记住,存储在代理授权中的username:password是base64编码的。
BStruthers

14
如果您的密码包含@符号,则可以通过将用户名和密码放在引号中进行传递。
绝对的网匠

9
您的密码中可以包含特殊字符,但是必须使用url编码。因此,如果您的密码是my@password,则.npmrc文件应包含my%40password密码部分。在某些情况下,将其放在引号中是可行的,但是对其进行编码是万无一失的。
克里斯·杰恩斯

1
另一个陷阱!如果您先前设置了系统变量HTTP-PROXY,请确保清除它们!
Sydwell '16

1
你传奇!我放弃了让npm上班的尝试,但这最终解决了它。
tamj0rd2

308

设定npm代理

对于HTTP

npm config set proxy http://proxy_host:port

对于HTTPS

如果有一个,请使用https代理地址

npm config set https-proxy https://proxy.company.com:8080

否则重用http代理地址

npm config set https-proxy http://proxy.company.com:8080

注意:https-proxy没有https作为协议,而是http


9
没有SOCKS支持?
grm

57
请注意,https-proxy的协议不是'https',而是'http'。更改此设置为我解决了问题。
peterhil

3
@peterhil感谢您的提示。太疯狂了,但是我花了几个小时用“ https”来解决这个问题。知道为什么会这样吗?
Manoj NV

2
@ManojNV,与代理服务器的连接未加密。它不是在与代理服务器使用HTTPS,而只是在使用HTTP。负载是客户端和目标服务器之间的SSL。如果是代理服务器的HTTPS,则将两次加密/解密。
杰米

1
微妙。非常感谢@peterhil
Alec Breton

104

如有疑问,请像我一样尝试所有这些命令:

npm config set registry http://registry.npmjs.org/
npm config set proxy http://myusername:mypassword@proxy.us.somecompany:8080
npm config set https-proxy http://myusername:mypassword@proxy.us.somecompany:8080
npm config set strict-ssl false
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

=======

更新

将设置放进去~/.bashrc~/.bash_profile这样您就不必在每次打开新的终端窗口时都担心设置!

如果您的公司像我的公司,我必须经常更改密码。因此,我在〜/ .bashrc或〜/ .bash_profile中添加了以下内容,以便每当打开终端时,我都知道我的npm是最新的!

  1. 只需将以下代码粘贴到~/.bashrc文件底部:

    ######################
    # User Variables (Edit These!)
    ######################
    username="myusername"
    password="mypassword"
    proxy="mycompany:8080"
    
    ######################
    # Environement Variables
    # (npm does use these variables, and they are vital to lots of applications)
    ######################
    export HTTPS_PROXY="http://$username:$password@$proxy"
    export HTTP_PROXY="http://$username:$password@$proxy"
    export http_proxy="http://$username:$password@$proxy"
    export https_proxy="http://$username:$password@$proxy"
    export all_proxy="http://$username:$password@$proxy"
    export ftp_proxy="http://$username:$password@$proxy"
    export dns_proxy="http://$username:$password@$proxy"
    export rsync_proxy="http://$username:$password@$proxy"
    export no_proxy="127.0.0.10/8, localhost, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16"
    
    ######################
    # npm Settings
    ######################
    npm config set registry http://registry.npmjs.org/
    npm config set proxy "http://$username:$password@$proxy"
    npm config set https-proxy "http://$username:$password@$proxy"
    npm config set strict-ssl false
    echo "registry=http://registry.npmjs.org/" > ~/.npmrc
    echo "proxy=http://$username:$password@$proxy" >> ~/.npmrc
    echo "strict-ssl=false" >> ~/.npmrc
    echo "http-proxy=http://$username:$password@$proxy" >> ~/.npmrc
    echo "http_proxy=http://$username:$password@$proxy" >> ~/.npmrc
    echo "https_proxy=http://$username:$password@$proxy" >> ~/.npmrc
    echo "https-proxy=http://$username:$password@$proxy" >> ~/.npmrc
    
    ######################
    # WGET SETTINGS
    # (Bonus Settings! Not required for npm to work, but needed for lots of other programs)
    ######################
    echo "https_proxy = http://$username:$password@$proxy/" > ~/.wgetrc
    echo "http_proxy = http://$username:$password@$proxy/" >> ~/.wgetrc
    echo "ftp_proxy = http://$username:$password@$proxy/" >> ~/.wgetrc
    echo "use_proxy = on" >> ~/.wgetrc
    
    ######################
    # CURL SETTINGS
    # (Bonus Settings! Not required for npm to work, but needed for lots of other programs)
    ######################
    echo "proxy=http://$username:$password@$proxy" > ~/.curlrc
  2. 然后在您粘贴的代码中编辑“用户名”,“密码”和“代理”字段。

  3. 打开一个新的终端

  4. 通过运行npm config list和检查设置cat ~/.npmrc

  5. 尝试使用安装模块

    • npm install __, 要么
    • npm --without-ssl --insecure install __, 要么
    • 使用覆盖您的代理设置npm --without-ssl --insecure --proxy http://username:password@proxy:8080 install __
    • 如果您希望模块在全球范围内可用,请添加选项 -g

3
最后一个命令对我有用。在此之前的所有
尝试都

3
我读到了大约50个有关此fu *** ing代理配置的答案...唯一起作用的是您的答案...谢谢!!!
洛伦佐

4
多谢你们!!很高兴它正在工作!这一直是工作中的头疼事,所以很高兴我可以帮助别人:P
凯蒂(Katie)

2
+1。这可行。我用命令- ,npm config set registry http://registry.npmjs.org/, , npm config set proxy http://myusername:mypassword@proxy.us.somecompany:8080 为NPM配置和使用再装NPM包。谢谢npm config set https-proxy http://myusername:mypassword@proxy.us.somecompany:8080npm config set strict-ssl falsenpm --proxy http://myusername:mypassword@proxy.us.somecompany:8080 --without-ssl --insecure -g install {packagename}
Atur

1
经过三天的尝试,此解决方案对我有用。
Mohan Singh,

33

您是否尝试过命令行选项而不是.npmrc文件?

我认为有些事情npm --proxy http://proxy-server:8080/ install {package-name}对我有用。

我还看到了以下内容: npm config set proxy http://proxy-server:8080/


+1我尝试了其他人,这是对我有用的人。来自Renato Gama的身份验证部分
winner_joiner 2013年

20

尽管已经有很多好的建议,但是对于我的环境(Windows 7,使用PowerShell)和最新可用的node.js版本(v8.1.2),上述所有方法均无效,除非我遵循brunowego设置。

因此,请使用以下命令检查您的设置:

npm config list

代理背后的设置:

npm config set registry http://registry.npmjs.org/
npm config set http-proxy http://username:password@ip:port
npm config set https-proxy http://username:password@ip:port
npm config set proxy http://username:password@ip:port
npm set strict-ssl false

希望这可以节省时间给某人


我如何找到我的代理地址?
罗宾

@Robin一种方法,如果使用Windows,则IE将其存储。您可以进入IE并查看连接下的LAN设置,它将在此处显示。
eaglei22

@Robin当然取决于浏览器,但通常是在设置下
Carmine Tambascia

在浏览器中的@Robin设置下,您应该看到/检查代理设置。通常会有一个带有.pac的文件,最后一个像是:PROXY YourProxyAdress:PORT
Carmine Tambascia

17

这在Windows中对我有效:

npm config set proxy http://domain%5Cuser:pass@host:port

如果您不在任何域中,请使用:

npm config set proxy http://user:pass@host:port

如果您的密码包含特殊字符,例如"@:等等,通过他们的URL编码值替换它们。例如"-> %22@-> %40:-> %3A%5C用于角色\


6
感谢您的建议,这对我有用。您可以使用ctrl + shift + j打开JavaScript控制台,然后键入encodeURIComponent("YourP@ssword")以获取密码的编码版本。
jaggedsoft '16

15

要设置http代理,请设置-g标志:

sudo npm config set proxy http://proxy_host:port -g

对于https代理,再次确保设置了-g标志:

sudo npm config set https-proxy http://proxy_host:port -g


-g是什么意思?
戴维(David)

1
将其设置在全球范围内,而不是用于本地安装
Andrei 2015年



7

vim ~/.npmrc在您的Linux机器中并添加以下内容。不要忘记添加registry零件,因为在许多情况下这会导致故障。

proxy=http://<proxy-url>:<port>
https-proxy=https://<proxy-url>:<port>
registry=http://registry.npmjs.org/

2
许多代理支持通过隧道发送https请求,但它们不会处理与自己的https连接。因此,遇到麻烦时,请尝试修改https-proxy=https://..https-proxy=http://..
YoYo

7

最终,我设法解决了使用AD身份验证作为代理的问题。我必须执行:

npm config set proxy http://domain%5Cuser:password@proxy:port/
npm config set https-proxy http://domain%5Cuser:password@proxy:port/

URL编码任何特殊字符(例如反斜杠或#)非常重要,在我的情况下,我必须编码

  1. backshlash用%5c,使domain\user willdomain%5Cuser
  2. #与签名%23%0A等等之类密码Password#2Password%23%0A2

我还添加了以下设置:

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


6

我尝试了所有这些选项,但是由于某种原因,我的代理没有任何选项。然后,出于绝望/绝望的缘故,我curl在Git Bash shell中随机尝试了一下,结果成功了。

使用取消设置所有代理选项

npm config rm proxy
npm config rm https-proxy

然后npm install在我的Git Bash shell中运行完美。我不知道如何为代理正确设置它,而Windows cmd提示符却不正确,但它确实有效。


6
npm config set proxy <http://...>:<port_number>
npm config set registry http://registry.npmjs.org/

这解决了我的问题。


关键是更改到注册表的链接:而不是之前链接到HTTP的https。
Alex Fainshtein

6

最后绑好不同的答案后,@ Kayvar答案的前四行可以帮助我解决问题:

npm config set registry http://registry.npmjs.org/
npm config set proxy http://myusername:mypassword@proxy.us.somecompany:8080
npm config set https-proxy http://myusername:mypassword@proxy.us.somecompany:8080
npm config set strict-ssl false



5

对我来说,即使python等都可以使用,但我们的公司代理npm却无法使用。

我试过了

npm config set proxy http://proxyccc.xxx.ca:8080 npm config set https-proxy https://proxyccc.xxx.ca:8080 npm config set registry http://registry.npmjs.org/

按照指示进行操作,但始终出现相同的错误。

只有 从.npmrc文件中删除https-proxy https://proxyccc.xxx.ca:8080,npm install electronic --save-dev才起作用


1
https-proxy可能不是https:。至少,为每个端口使用相同的端口可能不正确,但是我认为它们可能具有相同的值。
toddkaufmann

5

在Windows系统上

尝试删除代理和注册表设置(如果已设置),然后通过以下方式在命令行上设置环境变量

SET HTTP_PROXY=http://username:password@domain:port
SET HTTPS_PROXY=http://username:password@domain:port

然后尝试运行npm install。这样,您将不会在.npmrc中设置代理,但在该会话中它将起作用。


这对我有用。等于符号似乎可以使一切正常运行。我只是在使用前SET HTTP_PROXY http://username:password@domain:port但切换到SET HTTP_PROXY=http://username:password@domain:port似乎一切工作正常
迪布

4

在cmd或GIT Bash或其他提示下使用以下命令

$ npm config设置代理“ http://192.168.1.101:4128

$ npm config设置https-proxy“ http://192.168.1.101:4128

其中192.168.1.101是代理IP,而4128是端口。根据您的代理设置进行更改。它对我有用。


1
我必须使用域进行身份验证,并且使用转义反斜杠:带有此字符串%5C。终于成功了!
Francesco'7


4

就我而言,我忘记在配置文件(可以在C:\ Users \ [USERNAME] \。npmrc中找到)中设置“ http://”代理地址。所以不要

proxy=http://[IPADDRESS]:[PORTNUMBER]
https-proxy=http://[IPADDRESS]:[PORTNUMBER]

我有

proxy=[IPADDRESS]:[PORTNUMBER]
https-proxy=[IPADDRESS]:[PORTNUMBER]

当然哪个都不起作用,但是错误消息也没有太大帮助...


4

上面对于这个问题有很多答案,但是没有一个对我有用。他们都提到要添加http://前缀。所以我也添加了它。全部失败。

我不小心删除了http://前缀后,它终于可以工作了。最终的配置是这样的:

npm config set registry http://registry.npmjs.org/
npm config set http-proxy ip:port
npm config set https-proxy ip:port
npm config set proxy ip:port
npm set strict-ssl false

我不知道其背后的逻辑,但确实有效。如果以上答案均不适合您,也许您可​​以尝试这种方式。希望这一点有用。


4

在curl的SSL和证书问题页面上有很好的信息。我的大部分回答都基于那里的信息。

使用strict-ssl false是不好的做法,并且可能导致问题。我们可以做的是通过“中间人”证书添加要注入的证书。

如何在Windows上解决此问题:

  1. 从基于Mozilla的CA捆绑包的curl下载CA证书。您还可以使用curl的“ firefox-db2pem.sh” shellscript来转换本地Firefox数据库。
  2. 使用https转到网页,例如Chrome或Internet Explorer中的Stackoverflow
  3. 点击锁定图标,然后点击查看证书或Chrome中的“有效”
  4. 导航到“认证”路径。最高证书或根证书是我们要提取的证书。单击该证书,然后“查看证书”
  5. 单击第二个选项卡“详细信息”。点击“复制到文件”。选择DER格式,并记下保存文件的位置。选择一个合适的文件名,例如rootcert.cer
  6. 如果您安装了Git,则将拥有openssl.exe。否则,请在此阶段为Windows安装git。openssl可执行文件很可能位于C:\ Program Files \ git \ usr \ bin \ openssl.exe。我们将使用openssl将文件转换为NPM理解所需的PEM格式。
  7. 使用以下命令转换在步骤5中保存的文件:
    openssl x509 -inform DES -in **rootcert**.cer -out outcert.pem -text
    其中rootcert是在步骤5中保存的证书的文件名。
  8. 在足够聪明的文本编辑器中打开outcert.pem,以了解行尾,而不是记事本。选择所有文本并将其复制到剪贴板。
  9. 现在,我们将该内容粘贴到步骤1中制作的CA Cert软件包的末尾。因此,在高级文本编辑器中打开cacert.pem。转到文件末尾,然后将上一步中的内容粘贴到文件末尾。(保留您刚刚粘贴的内容下面的空行)
  10. 将保存的cabundle.pem复制到合适的位置。例如,您的%userprofile%或〜。记下文件的位置。
  11. 现在,我们将告诉npm / yarn使用新的捆绑软件。在一个命令,写入
    npm config set cafile **C:\Users\username\cacert.pem
    其中C:\ Users \用户名\ cacert.pem是从步骤10中的路径。
  12. (可选):再次打开strict-ssl, npm config set strict-ssl true

!我们做到了!现在npm可以理解如何连接了。好处是您可以告诉curl使用相同的cabundle.pem,它也可以理解HTTP。


3

这是我遵循的步骤(Windows):

  1. 编辑以下文件 C:\Users\<WIN_USERNAME>\.npmrc
  2. 从以下地址将证书导出到您的文件系统:https : //registry.npmjs.org

  3. 导航到导出的证书位置,然后发出以下命令:

    npm config set cafile npm_certificate.cer

  4. 将以下更改添加到文件: registry=https://registry.npmjs.org/ strict-ssl=false https-proxy=http://[proxy_user]:[proxy_password]@[proxy_ip]:[proxy_port]/ cafile=npm_certificate.cer

现在您应该准备出发了!


2

我的问题归结为我一个愚蠢的错误。由于有一天我很快将代理放入Windows * .bat文件(http_proxy,https_proxy和ftp_proxy)中,因此我忘记了对URL编码的域\用户(%5C)和带有问号的密码的特殊字符进行转义'?' (%3F)。也就是说,一旦有了编码后的命令,别忘了在bat file命令中转义'%'。

我变了

set http_proxy=http://domain%5Cuser:password%3F@myproxy:8080

set http_proxy=http://domain%%5Cuser:password%%3F@myproxy:8080

也许这是一个边缘案例,但希望它能对某人有所帮助。



0

只要打开新的终端输入npm config editnpm config -g edit。重置为默认值。在关闭的终端之后,打开新的终端,npm --without-ssl --insecure --proxy http://username:password@proxy:8080 install <package>如果需要全局输入,只需添加-g

它对我有用,希望对你有用:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.