英文:
Connection Resets When Using https.request with Options in NodeJS
问题
以下是您要翻译的内容:
在 NodeJS 中,当我使用 https.get()
时,我的代码正常工作,返回所需的响应。但一旦我切换到带有 requestOptions 的 https.request()
,我会收到连接重置错误,带有以下堆栈跟踪:
err: {
code: "ECONNRESET",
stack: "Error: read ECONNRESET\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:217:20)\n at TLSWrap.callbackTrampoline (node:internal/async_hooks:130:17)"
}
我的代码如下。只需将 https.get
和 https.request
互换:
const express = require('express');
const axios = require('axios');
const https = require('https');
const app = express();
app.all('/api/*', (req, res) => {
forwardRequest(req, res);
});
app.listen(4600, () => {
console.log('代理服务器监听端口 4600');
});
function forwardRequest(req, res) {
const agolUrl = buildTargetUrl(req);
const requestOptions = {
port: 443,
method: req.method,
headers: req.headers,
};
// const proxyReq = https.get(agolUrl, (proxyRes) => {
const proxyReq = https.request(agolUrl, requestOptions, (proxyRes) => {
let responseData = '';
proxyRes.on('data', (chunk) => {
responseData += chunk;
});
proxyRes.on('end', async () => {
doSomethingWithResponseData(responseData);
res.writeHead(proxyRes.statusCode, proxyRes.headers);
res.write(responseData);
res.end();
});
}).on('error', (err) => {
console.error(err);
res.status(500).send('代理出现错误。');
});
req.pipe(proxyReq); // 这是做什么的?
}
function buildTargetUrl(req) {
let targetUrl = 'https://some-remote-server.com' + req.originalUrl;
targetUrl = decodeURI(targetUrl);
targetUrl = targetUrl.replace('/api', '');
return targetUrl;
}
function doSomethingWithResponseData(responseData) {
// 自定义逻辑在这里。
}
依赖项如下:
// Node 版本为 v16.20.0
"dependencies": {
"axios": "^1.4.0",
"express": "^4.18.2",
"request": "^2.88.2"
}
请注意,这与此问题相同,但不幸的是它尚未得到答案,因此在这里发布了一个新问题。
英文:
In NodeJS, when I use https.get(), my code works correctly, returning the required responses. But as soon as I switch over to https.request() with requestOptions, I get connection reset error, with the following stack trace:
err: {
code: "ECONNRESET",
stack: ""Error: read ECONNRESET\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:217:20)\n at TLSWrap.callbackTrampoline (node:internal/async_hooks:130:17)"
}
My code is below. Simply swap out the https.get & https.request:
const express = require('express');
const axios = require('axios');
const https = require('https');
const app = express();
app.all('/api/*', (req, res) => {
forwardRequest(req, res);
});
app.listen(4600, () => {
console.log('Proxy server listening on port 4600');
});
function forwardRequest(req, res) {
const agolUrl = buildTargetUrl(req);
const requestOptions = {
port: 443,
method: req.method,
headers: req.headers,
};
// const proxyReq = https.get(agolUrl, (proxyRes) => {
const proxyReq = https.request(agolUrl, requestOptions, (proxyRes) => {
let responseData = '';
proxyRes.on('data', (chunk) => {
responseData += chunk;
});
proxyRes.on('end', async () => {
doSomethingWithResponseData(responseData);
res.writeHead(proxyRes.statusCode, proxyRes.headers);
res.write(responseData);
res.end();
});
}).on('error', (err) => {
console.error(err);
res.status(500).send('An error occurred with proxy.');
});
req.pipe(proxyReq); // What does this do?
}
function buildTargetUrl(req) {
let targetUrl = 'https://some-remote-server.com' + req.originalUrl;
targetUrl = decodeURI(targetUrl);
targetUrl = targetUrl.replace('/api', '');
return targetUrl;
}
function doSomethingWithResponseData(responseData) {
// Custom logic here.
}
The dependencies are:
// Node version is v16.20.0
"dependencies": {
"axios": "^1.4.0",
"express": "^4.18.2",
"request": "^2.88.2"
}
Note, this is the same as this question but unfortunately it doesn't have an answer yet, so posting a new one here.
答案1
得分: 0
已解决。事实证明,在标头中,目标主机"https://some-remote-server.com"不喜欢host
的值(在我的情况下,它是localhost)。
从标头中删除host
有效。
英文:
OK, figured it out. It turns out in the headers, the target host "https://some-remote-server.com" does not like the host
value (in my case, it was localhost).
Deleting the host
from the header worked.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论