Nodejs Node 16 无法给 https 请求使用 http 代理了

发布于 1周前 作者 nodeper 来自 nodejs/Nestjs

Nodejs Node 16 无法给 https 请求使用 http 代理了

Node 14 是可以的,不清楚有没有人可以搞定,可以付费

https://github.com/neoclide/coc.nvim/issues/3521

9 回复

代理是为了下载东西?


有可复现的代码吗?

我今天也遇到类似的问题,发现是因为 npm 包的版本太老,不支持 node16 ,修改 npm 包版本后就好了

确定 http_proxy 和 https_proxy 都试过?理论上 http 代理只是用 http 协议做握手的。

跟请求的 url 也有关系,有些就不会报错,有些偶尔能成功,不过我发现请求其实成功了:
js<br>let url = require('url')<br>let https = require('https')<br>let HttpsProxyAgent = require('https-proxy-agent')<br><br>// HTTP/HTTPS proxy to connect to<br>let proxy = 'http://127.0.0.1:7070'<br>console.log('using proxy server %j', proxy)<br><br>// HTTPS endpoint for the proxy to connect to<br>let endpoint = '<a target="_blank" href="https://registry.npmjs.org/coc-omni'" rel="nofollow noopener">https://registry.npmjs.org/coc-omni'</a><br>console.log('attempting to GET %j', endpoint)<br>let options = url.parse(endpoint)<br><br>// create an instance of the `HttpsProxyAgent` class with the proxy server information<br>let agent = new HttpsProxyAgent(proxy)<br>options.agent = agent<br><br>https.get(options, function (res) {<br> console.log('"response" event!', res.headers)<br> res.pipe(process.stdout)<br>})<br><br>

有一定失败的 url 吗?

我昨天碰到一个窘境,node-sass 需要 node-gyp ,node-gyp 又有一大堆依赖,同时还不支持 node 15 往上。 最直接的方式就是弄个 docker image, 把代码考进去,每次跑容器就好了

dockerfile<br>FROM node:14-alpine as base<br>ENV HOME=/home/node<br>RUN apk add --no-cache python3 make g++ &amp;&amp; \<br> yarn global add node-gyp@${VERSION} &amp;&amp; \<br> yarn cache clean &amp;&amp; \<br> node-gyp help &amp;&amp; \<br> mkdir $HOME/.cache &amp;&amp; \<br> chown -R node:node $HOME<br>USER node<br>VOLUME $HOME/.cache<br>WORKDIR $HOME<br>CMD ["sh"]<br><br>FROM base<br>WORKDIR /frontend<br>COPY package.json package.json<br>RUN yarn install<br>COPY . .<br>CMD ["npm", "start"]<br>

现在流行 ship with environment 不是没有理由的, 越来越多的版本和各式各样的依赖,只要一个不对口,整个项目就跑不起来

在Node.js中,使用HTTP代理来处理HTTPS请求确实需要一些额外的配置,特别是在Node.js 16及更高版本中,因为底层的HTTP/HTTPS库有了一些变化。不过,你可以使用https模块结合http-proxy-agenthttps-proxy-agent库来实现这个功能。

以下是一个使用https-proxy-agent库的示例代码,展示了如何通过HTTP代理发送HTTPS请求:

const https = require('https');
const HttpsProxyAgent = require('https-proxy-agent');

// 代理服务器地址和端口
const proxy = 'http://your-proxy-server:port';

// 目标HTTPS请求的选项
const options = {
  hostname: 'example.com',
  port: 443,
  path: '/',
  method: 'GET',
  agent: new HttpsProxyAgent(proxy) // 使用代理
};

// 发起请求
const req = https.request(options, (res) => {
  console.log(`STATUS: ${res.statusCode}`);
  console.log(`HEADERS: ${JSON.stringify(res.headers)}`);

  res.setEncoding('utf8');
  res.on('data', (chunk) => {
    console.log(`BODY: ${chunk}`);
  });
  res.on('end', () => {
    console.log('No more data in response.');
  });
});

req.on('error', (e) => {
  console.error(`Problem with request: ${e.message}`);
});

req.end();

请确保你已经安装了https-proxy-agent库,可以通过运行npm install https-proxy-agent来安装。将your-proxy-server:port替换为你的代理服务器地址和端口。这段代码将使用指定的HTTP代理来发送HTTPS请求。

回到顶部