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

NextJS中使用getServerSideProps获取数据返回Promise {<pending>}的问题

问题分析与解决

你的核心问题是错误地将getServerSideProps定义在了组件函数内部——这完全不符合Next.js的设计规则,getServerSideProps是Next.js专门用于页面级服务端数据获取的方法,必须定义在组件外部,且只会在服务器端执行,最终将获取到的数据作为props传递给组件。

另外,你直接调用getServerSideProps()时看到Promise {<pending>},是因为所有async函数调用后都会返回Promise,需要用await处理,但即使加了await,在组件内部这么用也是错误的,因为组件渲染阶段不能直接执行异步操作(会导致渲染异常)。

正确写法

步骤1:将getServerSideProps移到组件外部

步骤2:组件通过props接收服务端获取的数据

步骤3:处理路由参数的边界情况(比如参数未加载时的兼容)

import { useRouter } from 'next/router';

// 组件定义
const MyHomeComponent = ({ userDetails }) => {
  const router = useRouter();

  // 处理路由参数未就绪的情况(比如页面刚加载时)
  if (router.isFallback) {
    return <div>加载中...</div>;
  }

  // 渲染获取到的数据
  return (
    <div>
      <h1>用户详情</h1>
      <p>ID: {userDetails.id}</p>
      <p>名称: {userDetails.name}</p>
      {/* 根据你的数据结构渲染其他内容 */}
    </div>
  );
};

// 必须定义在组件外部的getServerSideProps
export async function getServerSideProps(context) {
  // 从context中获取路由参数,而不是在组件内部用useRouter
  const { userId, tagIds } = context.query;

  // 调用GraphQL接口获取数据
  const data = await graphqlClient.query({
    query: GET_DATA,
    variables: {
      userId: Number(userId),
      tagIds: tagIds,
    },
  });

  // 将数据作为props返回给组件
  return {
    props: {
      userDetails: data.data.userDetails,
    },
  };
}

export default MyHomeComponent;

关键说明

  • getServerSideProps会在每次请求时在服务器端执行,获取数据后通过props传递给组件,组件直接使用即可,无需在内部处理异步逻辑。
  • 路由参数要从getServerSideProps的context.query中获取,而不是在组件内部用useRouter——因为getServerSideProps运行在服务器端,无法访问客户端的useRouter钩子。
  • 如果需要处理页面加载时的状态(比如参数还未就绪),可以用router.isFallback来显示加载提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:13:14