有没有办法让npm install(命令)在代理后正常工作?

339
有没有办法让npm install在代理后面工作?我尝试在.npmrc文件中更改代理变量,但没有成功。我想避免手动下载。
32个回答

412
我用以下方法解决了这个问题:
  1. I run this command:

    npm config set strict-ssl false
    
  2. Then set npm to run with http, instead of https:

    npm config set registry "http://registry.npmjs.org/"
    
  3. Then I install packages using this syntax:

    npm --proxy http://username:password@cacheaddress.com.br:80 install packagename
    
如果代理不需要认证,可以跳过username:password部分。
编辑:我的一个朋友指出,您可以通过设置HTTP_PROXY和HTTPS_PROXY环境变量来使NPM在代理后工作,然后正常发出命令npm install express(例如)。
编辑2:正如@BStruthers所评论的那样,请记住,包含“@”的密码不会被正确解析,如果包含@,请将整个密码放在引号中。

7
注意,如果您的密码包含“@”,npm将无法正确解析您的代理设置。一个潜在的解决方法是在npm配置中放置一个虚假的用户名:密码,并使用本地代理(如fiddler)来修改请求的Proxy-Authorization头以具有正确的用户名:密码。请记住,存储在Proxy-Authorization中的用户名:密码是base64编码的。 - BStruthers
17
如果您的密码包含@符号,您可以将用户名和密码放在引号内来通过验证。 - absynthe minded web smith
13
您的密码可以包含特殊字符,但必须进行URL编码。因此,如果您的密码为my@password,则您的.npmrc文件中密码部分应为my%40password。用引号括起来在某些情况下可行,但编码更为可靠。 - Chris Jaynes
1
另一个需要注意的地方!如果您之前设置了系统变量HTTP-PROXY,请确保将其清除! - Sydwell
1
你太棒了!我已经放弃在工作中尝试让npm工作了,但这最终解决了它。 - tamj0rd2
显示剩余12条评论

402

设置 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 代理的协议不是 https,而是 http


69
请注意,https代理的协议不是'https',而是'http'。将此更改解决了我的问题。 - peterhil
3
谢谢你的提示,这真是太疯狂了,我花了几个小时才解决了这个问题,仅仅因为使用了"https"。你有任何想法为什么会出现这种情况吗? - Manoj N V
6
@ManojNV,连接到代理服务器没有加密。它与代理服务器通信的不是HTTPS,而是HTTP。有效负载在客户端和目标服务器之间使用SSL加密。如果连接到代理服务器时也使用HTTPS,则会进行两次加密/解密操作。 - Jamie
1
微妙。非常感谢 @peterhil - heyitsalec
1
非常感谢大家提供的所有好主意!我使用了第1和第3个命令,然后运行了这个命令 npm config set registry "http://registry.npmjs.org/"。它奏效了 :) - Travis Le
显示剩余2条评论

128

当有疑问时,尝试所有这些命令,就像我一样:

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 listcat ~/.npmrc 检查你的设置。

  5. 尝试使用以下命令安装模块:

    • npm install __,或者
    • npm --without-ssl --insecure install __,或者
    • 通过使用 npm --without-ssl --insecure --proxy http://username:password@proxy:8080 install __ 覆盖你的代理设置。
    • 如果你想让该模块在全局可用,请添加选项 -g

3
上一个命令对我起作用了,之前的所有命令都失败了。 - foecum
5
我看了大约50个关于代理设置的答案...唯一有效的是你的回答...谢谢!!! - Lorenzo
4
谢谢!很高兴它正在发挥作用!这在工作中一直是一个巨大的头痛,所以我很高兴能帮助别人 :P - Katie
2
+1. 这个方法可行。我使用了以下命令:npm config set registry http://registry.npmjs.org/npm config set proxy http://myusername:mypassword@proxy.us.somecompany:8080npm config set https-proxy http://myusername:mypassword@proxy.us.somecompany:8080npm config set strict-ssl false 来配置 npm,然后使用 npm --proxy http://myusername:mypassword@proxy.us.somecompany:8080 --without-ssl --insecure -g install {packagename} 安装了 npm 包。谢谢。 - Atur
1
经过三天的尝试,这个解决方案对我起作用了。 - Mohan Singh
显示剩余5条评论

39

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

我认为像这样的命令可以解决问题:npm --proxy http://proxy-server:8080/ install {package-name}

我也看到了下面的命令:npm config set proxy http://proxy-server:8080/


+1 我试过其他的,但这个对我有效。其中包含了Renato Gama提供的认证部分。 - winner_joiner
我已经设置了环境变量:set HTTPS_PROXY=127.0.0.1:8080 set HTTP_PROXY=127.0.0.1:8080,同时也为npm设置了代理值:npm config set proxy 127.0.0.1:8080 npm config set http-proxy 127.0.0.1:8080 npm config set https-proxy 127.0.0.1:8080。但是使用这些代理设置后,我无法访问https页面。 - Yatin Kanyal

23

虽然已经有很多好的建议,但对于我的环境(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
@Robin 如果使用Windows,IE会将它们存储。您可以在IE下查看连接的LAN设置,它会在那里显示。 - eaglei22
@Robin 当然取决于浏览器,但通常在设置下面。 - Carmine Tambascia
@Robin,在浏览器的设置下,您应该看到/检查代理设置。通常有一个名为.pac的文件,其中最后一行应为:PROXY YourProxyAdress:PORT - Carmine Tambascia
我已经为npm设置了代理值:npm config set proxy 127.0.0.1:8080,npm config set http-proxy 127.0.0.1:8080,npm config set https-proxy 127.0.0.1:8080。但是使用这些代理设置后,我不能访问https页面。 - Yatin Kanyal
@Yatin Kanyal 因为实际上设置是“http-proxy”,请尝试使用我上面写的“https-proxy”。 - Carmine Tambascia

18

这在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

7
谢谢您的建议,这对我有用。您可以通过按下ctrl+shift+j打开JavaScript控制台,并输入encodeURIComponent("YourP@ssword")来获取密码的编码版本。 - jaggedsoft
我已经为npm设置了代理值: npm config set proxy 127.0.0.1:8080, npm config set http-proxy 127.0.0.1:8080 , npm config set https-proxy 127.0.0.1:8080。但是使用这些代理设置后,我无法访问https页面。 - Yatin Kanyal
你的代理是否在本地主机(127.0.0.1)上? - Andrei

16

设置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 是什么意思? - Dave
1
将其全局设置,而非本地安装。 - Andrei
我已经为npm设置了代理值:npm config set proxy 127.0.0.1:8080,npm config set http-proxy 127.0.0.1:8080,npm config set https-proxy 127.0.0.1:8080。但是在使用这些代理设置时,我无法访问https页面。我也尝试了使用-g选项。 - Yatin Kanyal

9
最终,我成功解决了使用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将变为domain%5Cuser
  2. 使用%23%0A#符号进行编码,因此像Password#2这样的密码将变为Password%23%0A2

我还添加了以下设置:

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

我已经为npm设置了代理值:npm config set proxy 127.0.0.1:8080,npm config set http-proxy 127.0.0.1:8080,npm config set https-proxy 127.0.0.1:8080。使用这些代理设置,我无法访问https页面。 - Yatin Kanyal

9
这对我有用 -
npm config set proxy http://proxy.company.com:8080
npm config set https-proxy http://proxy.company.com:8080
npm set strict-ssl=false

我已经为npm设置了代理值:npm config set proxy 127.0.0.1:8080,npm config set http-proxy 127.0.0.1:8080,npm config set https-proxy 127.0.0.1:8080。使用这些代理设置,我无法访问https页面。 - Yatin Kanyal

8
$ npm config set proxy http://login:pass@host:port
$ npm config set https-proxy http://login:pass@host:port

1
请添加一些注释。 - Max

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