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

NextJS App Router调用getData()返回空,直接fetch正常?

问题解答:为何调用getData()显示空数据,直接使用fetch却正常?

核心原因

getData()是异步函数,调用时未添加await关键字,因此返回的是一个Promise对象。而JSON.stringify处理Promise对象时,由于Promise没有可枚举的自有属性,最终会序列化为{}。

反观直接使用fetch的代码,你通过await等待了请求完成和JSON解析,拿到的是实际的响应数据,所以能正常显示。

修正方案

调用异步函数getData()时必须添加await,在Next.js App Router的服务器组件中,组件本身支持async/await,可以直接在组件顶层完成异步数据获取:

export default async function Home() {
  async function getData() {
    const res = await fetch("https://jsonplaceholder.typicode.com/posts");
    return await res.json();
  }

  // 添加await等待getData执行完成
  const dataFromGetData = await getData();
  const res = await fetch("https://jsonplaceholder.typicode.com/posts");
  const data = await res.json();

  return (
    <>
      现在可以正常显示数据:{JSON.stringify(dataFromGetData, null, 2)}
      原本的代码依然正常:{JSON.stringify(data, null, 2)}
    </>
  );
}

额外注意

在Next.js App Router的服务器组件中,不要在JSX渲染逻辑里直接调用异步函数(比如{JSON.stringify(getData(), null, 2)}这种写法),因为JSX渲染时不会自动等待Promise完成。必须先在组件顶层通过await拿到数据,再将数据传入JSX进行渲染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 06:20:57