为什么同样的在浏览器和 postman 中可以请求到,而在本地 Nodejs 代码中请求不到?

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

为什么同样的在浏览器和 postman 中可以请求到,而在本地 Nodejs 代码中请求不到?

我有这样一个请求: https://api.pinterest.com/v1/me/pins/?access_token=xyz,access_token 是有效的,直接粘贴在浏览器地址栏或 postman 中可以访问到,但是使用 如下代码

// test.js
var http = require("https");

var options = {
  "method": "GET",
  "hostname": "api.pinterest.com",
  "port": null,
  "path": "/v1/me/pins?access_token=xyz",
};

var req = http.request(options, function (res) {
  var chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    var body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();

使用 node test.js 运行时报这样的错:

  errno: 'ETIMEDOUT',
  code: 'ETIMEDOUT',
  syscall: 'connect',
  address: '173.252.102.241',
  port: 443

请教各位 v 友指点迷津,感谢。


8 回复

因为你浏览器开代理了


抓个包看看请求有什么不同

useragent 是防爬虫最简单的做法,你没修改就等同于告诉对方你是爬虫

有没有可能是 HTTPS 认证的问题 原因可能出在 nodejs 版本不支持 HTTPS 认证 gcc 版本过低 或者其他什么方面
之前在公司服务器上遇到过 重新打个新 docker 就 OK 了

不要相信自己的封装能力,用现成的 request、superagent 库

感谢,使用 request 库并设置代理已解决问题。

确实是代理问题
不懂如何抓包

当你在浏览器和Postman中可以成功请求到某个资源,但在本地Node.js代码中请求不到时,可能的原因包括但不限于以下几点:

  1. 请求头差异: 浏览器和Postman可能自动处理了一些请求头,比如User-AgentCookiesAuthorization等,而你的Node.js代码可能没有正确设置这些头。

    const axios = require('axios');
    
    axios.get('https://example.com/api', {
      headers: {
        'User-Agent': 'Your-User-Agent',
        'Authorization': 'Bearer YOUR_TOKEN'
      }
    })
    .then(response => console.log(response.data))
    .catch(error => console.error(error));
    
  2. CORS(跨源资源共享)策略: 服务器可能配置了CORS策略,仅允许来自特定源的请求。

  3. 网络问题: 本地Node.js环境可能存在网络配置问题,如代理、VPN设置等。

  4. 请求方式或参数: 确保Node.js代码中使用的请求方式与Postman或浏览器一致,包括GET、POST等,以及所有必要的请求参数。

  5. 证书问题: 如果请求的是HTTPS资源,本地Node.js环境可能因证书问题而失败。可以尝试忽略证书验证(仅用于开发环境):

    const https = require('https');
    
    https.get('https://example.com/api', { rejectUnauthorized: false }, (res) => {
      // 处理响应
    }).on('error', (e) => {
      console.error(e);
    });
    

检查以上几点,通常可以解决大多数在Node.js中请求失败的问题。

回到顶部