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

NextJS 13 API测试工具返回JSON,前端仅获ReadableStream

问题原因与解决方案

你的API路由本身没有问题,问题出在客户端组件的fetch调用上——fetch API默认返回的是Response对象,其中的响应体以ReadableStream形式存在,你需要主动调用.json()方法来解析成JSON数据。

错误代码的问题点

你当前的handleClick函数里,await fetch()拿到的是包含响应状态、头信息的Response实例,并非直接的JSON内容:

async function handleClick() {
  let data = await fetch("http://localhost:3000/api/test", {
    method: "GET",
    headers: {
      "Content-Type": "application/json",
      Accept: "application/json",
    },
  });
  console.log("data", data); // 这里输出的是Response对象,不是解析后的JSON
}

修改后的正确代码

只需在拿到Response后,调用.json()方法解析响应体:

"use client";

export default function ExampleClientComponent({children}) {

  async function handleClick() {
    const response = await fetch("http://localhost:3000/api/test", {
      method: "GET",
      headers: {
        "Content-Type": "application/json",
        Accept: "application/json",
      },
    });
    // 新增这一步:解析响应体为JSON
    const data = await response.json();
    console.log("data", data); // 现在会输出 { my: "data" }
  }
   
  return (
    <>
      <button onClick={handleClick}>Go</button>
    </>
  );
}

额外优化建议

  • GET请求是fetch的默认方法,可以省略method: "GET"参数;
  • GET请求通常不需要发送请求体,Content-Type头也可以省略;
  • 使用相对路径/api/test代替绝对路径,更适配不同部署环境:
async function handleClick() {
  const response = await fetch("/api/test");
  const data = await response.json();
  console.log("data", data);
}

补充说明

你的API路由完全正常——从测试工具的响应可以看到,NextResponse.json()已经正确设置了Content-Type: application/json响应头,返回的是标准JSON内容。浏览器fetch的设计就是分两步:先获取响应元数据,再解析响应体,和后端返回的格式无关。

内容的提问来源于stack exchange,提问作者user2338274

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:27:28