You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 07:50:28