Node.js全局代理设置

57

我曾在一个代理服务器的企业网络中工作。在我的代码中,我可以使用这个帖子中提到的方法设置代理。

但问题是大多数第三方模块没有代理设置,我不能修改它们的代码以添加代理。此外,我的代码可能会在直接连接环境中使用,这意味着我不能在代码中硬编码我的代理设置。

我知道NPM有一个全局代理设置:

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

但我在Node.js中没有找到类似的配置。

Node.js支持全局代理设置吗,这样我就不需要更改所有代码并轻松切换开关了吗?


2
从Node.js v12开始,您可以使用https://github.com/gajus/global-agent。 - Gajus
5个回答

31

很遗憾,似乎每次调用http.request都必须设置代理信息。Node没有提供全局代理设置的机制。

然而,NPM上的global-tunnel-ng模块似乎可以处理这个问题:

var globalTunnel = require('global-tunnel-ng');

globalTunnel.initialize({
  host: '10.0.0.10',
  port: 8080,
  proxyAuth: 'userId:password', // optional authentication
  sockets: 50 // optional pool size for each http and https
});

在调用initialize函数后,全局设置已经被建立,http.requestrequest将会使用代理信息。
此模块还可以使用http_proxy环境变量:
process.env.http_proxy = 'http://proxy.example.com:3129';
globalTunnel.initialize();

所以有一个全局的代理设置机制吗?因为这基本上就是 env.http_proxy 是什么,对吧? - Michael McLaughlin
全局隧道配置中可以指定用户名和密码吗? - Anirudh Jayakumar

6

您可以尝试使用我的包node-global-proxy,它适用于所有的Node版本和大部分的http客户端(axios、got、superagent、request等)。

安装后通过以下命令启动全局代理:

npm install node-global-proxy --save

const proxy = require("node-global-proxy").default;

proxy.setConfig({
  http: "http://localhost:1080",
  https: "https://localhost:1080",
});
proxy.start();

/** Proxy working now! */

更多信息请点击这里:https://github.com/wwwzbwcom/node-global-proxy


这样检索我在浏览器中访问的URL是否好? - CholMugod
“https://localhost:1080” 会报错,提示必须以 “http://” 开头。 - izogfif
@shivshankar 很久以前的事了,但我总算是让它工作了。根据 package-lock.json,工作版本是 1.0.1。工作的 index.js 包含以下代码:const proxy = require("node-global-proxy").default; proxy.setConfig({http: "http://localhost:8888", https: "http://localhost:8888"}); proxy.start(); - izogfif
@izogfif 把 https 改成 http 就可以了。例如 https: "http://localhost:1080" - Philip
@Philip Ehm,这就是我在评论中写的内容。http和https都指向同一个地址:http://localhost:8888 - izogfif
显示剩余2条评论

4

1
非常好的解决方案,我正在使用第三方中间件,它将进行HTTP请求,如何在这种情况下解决代理问题? - yuyue007
如果第三方模块使用 http 模块发送请求,我博客中的代码可以解决你的问题。只需确保在第三方模块之前 require 我的模块即可。 - Shaun Xu
网址返回404错误,我找到了这个:http://geekswithblogs.net/shaunxu/archive/2013/09/05/semi-global-proxy-setting-for-node.js.aspx - haxpor

3

虽然不是Nodejs的设置,但我建议您使用我认为非常方便的proxychains。它可能已经在您的软件包管理器中提供。

在配置文件中设置代理(对于我来说是/etc/proxychains.conf),您可以运行proxychains npm startproxychains4 npm start(即proxychains [command_to_proxy_transparently])并且所有请求都将自动代理。

我的配置设置:

这些是您必须添加的最小设置。

## Exclude all localhost connections (dbs and stuff)
localnet 0.0.0.0/0.0.0.0
## Set the proxy type, ip and port here
http    10.4.20.103 8080

您可以使用 nslookup [proxyurl] 命令获取代理的 IP 地址。

-5

请将{userid}{password}替换为您在组织中的ID和密码,或登录到您的计算机。

npm config set proxy http://{userid}:{password}@proxyip:8080/
npm config set https-proxy http://{userid}:{password}@proxyip:8080/
npm config set http-proxy http://{userid}:{password}@proxyip:8080/
strict-ssl=false

请注意,如果{userid}和{password}包含元字符(如“/”,“:”,“@”等),则需要对它们进行URL编码。 - Fred Danna
这个问题已经在问题中得到了解决。这个问题是关于一个node.js代理,而不是npm代理。 - Amit Naidu

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