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

Next.js中如何访问getServerSideProps的props及ctx相关疑问

Next.js + Apollo/GraphQL + TypeScript 问题解决:Props类型补全与getServerSideProps ctx说明

一、Props类型不完整导致IDE无法自动补全

你的PageProps只声明了graphQlClientId,但实际从getServerSideProps返回并经withApolloState处理后的props包含更多字段:你自己返回的authToken、clientId、csrfToken,以及withApolloState注入的__APOLLO_STATE__(Apollo客户端缓存状态)。另外你代码里直接引用的user并未从props解构,且__APOLLO_STATE__是Apollo内部缓存,不建议直接读取获取业务数据。

解决方式1:将user数据直接放入props返回

修改getServerSideProps,把查询到的user数据加入返回的props集合,同时完善PageProps的类型定义:

// 先定义User的类型,可根据GraphQL查询结构自动生成(比如用GraphQL Codegen)
type User = {
  name: string;
  // 其他字段根据你的查询添加
};

export interface PageProps {
  graphQlClientId: string;
  authToken: string;
  csrfToken: string;
  user: User;
}

export const getServerSideProps: GetServerSideProps<PageProps> = async (ctx) => {
  const { apolloClient, clientId, authToken, csrfToken } = await getApolloClient(ctx);

  try {
    const { data } = await apolloClient.query({
      query: GetUserDocument,
      variables: { clientId },
    });

    return withApolloState({ 
      apolloClient, 
      authToken, 
      graphQlClientId: clientId, // 统一命名,避免clientId/graphQlClientId混淆
      csrfToken,
      user: data.user
    });
  } catch (err) {
    console.error(err);
    // 错误兜底,返回默认值或执行重定向
    return { 
      props: { 
        graphQlClientId: '', 
        authToken: '', 
        csrfToken: '', 
        user: { name: '' } 
      } 
    };
  }
};

这样页面组件就能通过props.user直接访问数据,IDE也能自动补全所有字段。

解决方式2:完整定义包含Apollo注入字段的Props类型

如果确实需要保留__APOLLO_STATE__,可以导入Apollo提供的类型来扩展:

import { ApolloState } from '@apollo/client/react/ssr';

export interface PageProps {
  graphQlClientId: string;
  authToken: string;
  csrfToken: string;
  __APOLLO_STATE__: ApolloState<any>;
}

但更推荐方式1,直接将业务数据放入props,代码更直观且符合TypeScript类型规范。

二、getServerSideProps的ctx是什么?

ctx是Next.js提供的GetServerSidePropsContext对象,由Next.js在服务器端执行getServerSideProps时自动传入,包含当前请求的全部上下文信息,核心字段有:

  • req: Node.js原生HTTP请求对象,可获取请求头、Cookie、请求方法等
  • res: Node.js原生HTTP响应对象,可设置响应头、状态码等
  • params: 动态路由参数(比如/user/[id]页面中的id)
  • query: URL查询参数(比如?tab=profile中的tab)
  • locale: 当前页面的语言区域(若开启国际化)
  • preview: 是否处于预览模式
  • previewData: 预览模式下的附加数据

你调用getApolloClient(ctx)时,通常是用它从req中提取Cookie、认证头信息,初始化带有用户状态的Apollo客户端。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:40:30