使用superagent发送HTTP请求返回空对象与undefined问题求助
为什么我的JavaScript请求返回{}和undefined,但Python请求能正常获取内容?
我编写了一段使用await特性的JavaScript HTTP请求代码,运行后得到的结果为{}和undefined。但使用相同的URL与请求头,通过Python的requests库发送请求却能成功获取内容,请问我的JavaScript代码中遗漏了什么?
JavaScript代码
import pkg from 'superagent'; const { get } = pkg; const header = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Safari/605.1.15' }; const url = 'https://books.toscrape.com'; class Agent { constructor(url, headers){ this.url = url; this.headers = headers; } getAgent = async () => { const res = await get(this.url) .set(this.headers); return res.body; } }; const request = new Agent(url, header); console.log(await request.getAgent());
Python对比代码
import requests header = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Safari/605.1.15' } url = 'https://books.toscrape.com' print(requests.get(url, headers=header).content)
问题原因与解决方法
问题出在superagent的默认行为上:superagent会自动尝试把响应内容解析为JSON格式,但目标网站https://books.toscrape.com返回的是HTML文本,不是JSON,解析失败后就会返回空对象{},极端情况下会得到undefined。
而Python的requests.get(...).content直接返回原始二进制响应内容,没有做自动格式解析,所以能正常拿到HTML。
要修复这个问题,你可以根据需求选择以下方式之一:
- 想要获取HTML文本内容:将
return res.body改为return res.text - 想要获取原始二进制内容:将
return res.body改为return res.buffer - 提前关闭自动解析,保留原始内容:在请求链中添加
.buffer()方法,示例如下:
getAgent = async () => { const res = await get(this.url) .set(this.headers) .buffer(); // 关闭自动解析逻辑 return res.text; // 按需选择res.text或res.buffer }
内容的提问来源于stack exchange,提问作者Working dollar
相关产品推荐
相关产品推荐

