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

Express接口返回ReadableStream而非JSON的原因排查

Express接口返回JSON但客户端收到ReadableStream问题解决

问题描述

使用Express创建API接口时,通常调用res.json()会返回JSON对象供客户端直接解析,但在通过批量Promise处理数据后返回对象,客户端收到的响应body却是ReadableStream,而非预期的JSON对象。

相关代码

辅助函数

const addCoinVolumeData = async (data) => {
  const promises = data.map(async datum => {
    const volumeData = await fetchCoinGeckoCoinVolume(datum.id);
    const volumeDelta = calculateCoinVolumeDelta(volumeData);
    datum.volume_change_24h = volumeDelta;
    return datum;
  });

  const result = await Promise.all(promises);
  return result;
}

接口响应代码

data = await addCoinVolumeData(data);
res.json(data);

客户端接收的响应内容

Response {type: 'basic', url: 'http://localhost:3001/aggregate-coin-data', redirected: false, status: 200, ok: true, …}
body: ReadableStream
bodyUsed: false
headers: Headers {}
ok: true
redirected: false
status: 200
statusText: "OK"
type: "basic"

问题原因

这并非服务端代码的问题,而是客户端对Fetch API返回的Response对象处理不当导致的。浏览器Fetch API返回的Response对象本身包含ReadableStream格式的body,需要主动调用解析方法才能得到JSON对象。

解决方案

客户端在获取到Response后,需要调用.json()方法将ReadableStream解析为JSON对象,示例代码如下:

链式调用写法

fetch('http://localhost:3001/aggregate-coin-data')
  .then(response => response.json()) // 关键步骤:解析响应为JSON
  .then(jsonData => {
    // 此处可处理解析后的JSON数据
    console.log(jsonData);
  })
  .catch(error => console.error('请求或解析出错:', error));

Async/Await写法

async function fetchCoinData() {
  try {
    const response = await fetch('http://localhost:3001/aggregate-coin-data');
    const jsonData = await response.json(); // 解析响应为JSON
    console.log(jsonData);
  } catch (error) {
    console.error('请求或解析出错:', error);
  }
}

fetchCoinData();

说明:服务端的res.json()已经正确设置了Content-Type: application/json响应头,并将数据序列化为JSON字符串返回,只需客户端补充解析步骤即可拿到预期的JSON数据。

内容的提问来源于stack exchange,提问作者collide.in.scope

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:39:40