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
相关产品推荐
相关产品推荐

