Nodejs request 模块和 https 模块请求同一个文件 URI 时,request 模块请求失败
Nodejs request 模块和 https 模块请求同一个文件 URI 时,request 模块请求失败
神奇的是,使用 https 模块时可以正常访问 uri 并保存在本地,但是使用 request 模块时请求都发不出去,百思不得其解,报错信息如下:
Error: tunneling socket could not be established, cause=getaddrinfo ENOTFOUND 7890
at ClientRequest.onError (D:\www\BWK_Spider\node_modules\tunnel-agent\index.js:177:17)
at Object.onceWrapper (node:events:642:26)
at ClientRequest.emit (node:events:527:28)
at Socket.socketErrorListener (node:_http_client:454:9)
at Socket.emit (node:events:527:28)
at emitErrorNT (node:internal/streams/destroy:157:8)
at emitErrorCloseNT (node:internal/streams/destroy:122:3)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {
code: 'ECONNRESET'
}
request 模块代码:
const request = require("request");
const fs = require("fs");
request(“https://xxx.xx.xx/20_C12100030.pdf”)
.pipe(fs.createWriteStream(“C:\Users\444\Desktop\20_C12100030.pdf”))
.on(“close”, function (err) {
console.log(“下载完成”);
console.log(err);
})
.on(“error”, function (err) {
console.log(err);
});
https 模块代码
const https = require("https");
const file = fs.createWriteStream(
“C:\Users\444\Desktop\20_C12100030.pdf”
);
https
.get(“https://xxx.xx.xx/20_C12100030.pdf”, (response) => {
console.log(“请求成功”);
response.pipe(file);
// after download completed close filestream
file.on("finish", () => {
file.close();
console.log("Download Completed");
});
})
.on(“error”, (err) => {
console.log("Error: ", err.message);
});
有遇到这种情况的吗?网上搜索都说是 npm 代理导致的,但实际不是,否则使用 https 模块时也应该是请求发不出去才对。
7890 这个显然是你的梯子代理端口
request 读了你的 HTTP_PROXY/HTTPS_PROXY 环境变量
我梯子可正常访问呐
https 模块又不会自动走代理
在Node.js中,request
模块和https
模块在请求同一个文件URI时,如果request
模块请求失败,可能有几个原因。首先,request
模块(通常指的是request
或request-promise
等第三方库)和Node.js内置的https
模块在处理请求的方式上可能存在差异。以下是一些可能的解决方案和排查步骤,包括示例代码:
-
确保
request
模块已正确安装:npm install request
-
使用
https
模块请求文件URI:const https = require('https'); https.get('https://example.com/file.txt', (res) => { console.log(`statusCode: ${res.statusCode}`); res.on('data', (d) => { process.stdout.write(d); }); }).on('error', (e) => { console.error(`Got error: ${e.message}`); });
-
使用
request
模块请求文件URI(如果安装的是request
库):const request = require('request'); request('https://example.com/file.txt', (error, response, body) => { if (error) { console.error('Error:', error); } else { console.log('Body:', body); } });
-
检查URI是否正确:确保请求的URI是有效的,并且服务器允许访问。
-
查看错误详情:
request
模块失败时,检查错误对象error
以获取更多信息。
如果https
模块成功而request
模块失败,可能是request
模块的内部问题或配置问题。考虑查看request
模块的文档或寻求社区帮助。