为什么同样的在浏览器和 postman 中可以请求到,而在本地 Nodejs 代码中请求不到?
为什么同样的在浏览器和 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 友指点迷津,感谢。
因为你浏览器开代理了
抓个包看看请求有什么不同
useragent 是防爬虫最简单的做法,你没修改就等同于告诉对方你是爬虫
有没有可能是 HTTPS 认证的问题 原因可能出在 nodejs 版本不支持 HTTPS 认证 gcc 版本过低 或者其他什么方面
之前在公司服务器上遇到过 重新打个新 docker 就 OK 了
不要相信自己的封装能力,用现成的 request、superagent 库
感谢,使用 request 库并设置代理已解决问题。
确实是代理问题
不懂如何抓包
当你在浏览器和Postman中可以成功请求到某个资源,但在本地Node.js代码中请求不到时,可能的原因包括但不限于以下几点:
-
请求头差异: 浏览器和Postman可能自动处理了一些请求头,比如
User-Agent
、Cookies
、Authorization
等,而你的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));
-
CORS(跨源资源共享)策略: 服务器可能配置了CORS策略,仅允许来自特定源的请求。
-
网络问题: 本地Node.js环境可能存在网络配置问题,如代理、VPN设置等。
-
请求方式或参数: 确保Node.js代码中使用的请求方式与Postman或浏览器一致,包括GET、POST等,以及所有必要的请求参数。
-
证书问题: 如果请求的是HTTPS资源,本地Node.js环境可能因证书问题而失败。可以尝试忽略证书验证(仅用于开发环境):
const https = require('https'); https.get('https://example.com/api', { rejectUnauthorized: false }, (res) => { // 处理响应 }).on('error', (e) => { console.error(e); });
检查以上几点,通常可以解决大多数在Node.js中请求失败的问题。