使用 axios.get 时套接字挂起,但使用 https.get 时不会
Socket hang up when using axios.get, but not when using https.get
据我所知,我正在使用两种不同的方法做同样的事情:
const https = require("https");
const axios = require("axios");
let httpsAgent = new https.Agent({rejectUnauthorized: false});
axios.get(`https://${hostname}:${port}${path}`, {httpsAgent})
.then((data) => { console.log("axios success: " + data.substr(0, 100)); })
.catch((error) => { console.log("axios error: " + error); });
let data = "";
https.get({ hostname, path, port, agent: httpsAgent },
(response) => {
response.on("data", (chunk) => { data += chunk; });
response.on("end", () => { console.log("https success: " + data.substr(0, 100)); });
})
.on("error", (error) => { console.log("https error: " + error); });
当我 运行 此代码时,我得到 2 个不同的结果:
PS C:\Users\me> .\node\node.exe .\generate-test-data.js
axios error: Error: socket hang up
https success: [{"cool":"data"...
这是怎么回事?我觉得它与异步性有关,但不太确定如何...有人可以给我提示 how/why 这两种行为是不同的吗?
唉!
在 axios 源代码中挖掘之后,我发现了这个:
if (!proxy) {
var proxyEnv = protocol.slice(0, -1) + '_proxy';
var proxyUrl = process.env[proxyEnv] || process.env[proxyEnv.toUpperCase()];
if (proxyUrl) {
var parsedProxyUrl = url.parse(proxyUrl);
proxy = {
host: parsedProxyUrl.hostname,
port: parsedProxyUrl.port
};
if (parsedProxyUrl.auth) {
var proxyUrlAuth = parsedProxyUrl.auth.split(':');
proxy.auth = {
username: proxyUrlAuth[0],
password: proxyUrlAuth[1]
};
}
}
}
但 no_proxy
什么都没有。似乎有一个 feature request for this...与此同时,我只需要:
delete process.env['http_proxy'];
delete process.env['HTTP_PROXY'];
delete process.env['https_proxy'];
delete process.env['HTTPS_PROXY'];
感谢您的领导(和挖掘 :)),您识别的代码来自 http 模块及其周围;有迹象表明可以通过其他两种方法解决此问题
- 在 axios 配置中设置 proxy = false,比如 -
https.get({ hostname, path, port, proxy:false, agent: httpsAgent },
- 不为目标主机设置代理环境变量
$export NO_PROXY=<host name of targeted URL>
以上两种方法我都试过了,确实解决了问题。干杯。
据我所知,我正在使用两种不同的方法做同样的事情:
const https = require("https");
const axios = require("axios");
let httpsAgent = new https.Agent({rejectUnauthorized: false});
axios.get(`https://${hostname}:${port}${path}`, {httpsAgent})
.then((data) => { console.log("axios success: " + data.substr(0, 100)); })
.catch((error) => { console.log("axios error: " + error); });
let data = "";
https.get({ hostname, path, port, agent: httpsAgent },
(response) => {
response.on("data", (chunk) => { data += chunk; });
response.on("end", () => { console.log("https success: " + data.substr(0, 100)); });
})
.on("error", (error) => { console.log("https error: " + error); });
当我 运行 此代码时,我得到 2 个不同的结果:
PS C:\Users\me> .\node\node.exe .\generate-test-data.js
axios error: Error: socket hang up
https success: [{"cool":"data"...
这是怎么回事?我觉得它与异步性有关,但不太确定如何...有人可以给我提示 how/why 这两种行为是不同的吗?
唉!
在 axios 源代码中挖掘之后,我发现了这个:
if (!proxy) {
var proxyEnv = protocol.slice(0, -1) + '_proxy';
var proxyUrl = process.env[proxyEnv] || process.env[proxyEnv.toUpperCase()];
if (proxyUrl) {
var parsedProxyUrl = url.parse(proxyUrl);
proxy = {
host: parsedProxyUrl.hostname,
port: parsedProxyUrl.port
};
if (parsedProxyUrl.auth) {
var proxyUrlAuth = parsedProxyUrl.auth.split(':');
proxy.auth = {
username: proxyUrlAuth[0],
password: proxyUrlAuth[1]
};
}
}
}
但 no_proxy
什么都没有。似乎有一个 feature request for this...与此同时,我只需要:
delete process.env['http_proxy'];
delete process.env['HTTP_PROXY'];
delete process.env['https_proxy'];
delete process.env['HTTPS_PROXY'];
感谢您的领导(和挖掘 :)),您识别的代码来自 http 模块及其周围;有迹象表明可以通过其他两种方法解决此问题
- 在 axios 配置中设置 proxy = false,比如 -
https.get({ hostname, path, port, proxy:false, agent: httpsAgent },
- 不为目标主机设置代理环境变量
$export NO_PROXY=<host name of targeted URL>
以上两种方法我都试过了,确实解决了问题。干杯。