Nodejs request 模块和 https 模块请求同一个文件 URI 时,request 模块请求失败

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

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 模块时也应该是请求发不出去才对。


5 回复

7890 这个显然是你的梯子代理端口


request 读了你的 HTTP_PROXY/HTTPS_PROXY 环境变量


我梯子可正常访问呐

https 模块又不会自动走代理

在Node.js中,request模块和https模块在请求同一个文件URI时,如果request模块请求失败,可能有几个原因。首先,request模块(通常指的是requestrequest-promise等第三方库)和Node.js内置的https模块在处理请求的方式上可能存在差异。以下是一些可能的解决方案和排查步骤,包括示例代码:

  1. 确保request模块已正确安装

    npm install request
    
  2. 使用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}`);
    });
    
  3. 使用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);
      }
    });
    
  4. 检查URI是否正确:确保请求的URI是有效的,并且服务器允许访问。

  5. 查看错误详情request模块失败时,检查错误对象error以获取更多信息。

如果https模块成功而request模块失败,可能是request模块的内部问题或配置问题。考虑查看request模块的文档或寻求社区帮助。

回到顶部