本地运行正常但Vercel部署报错:读取'titulo_categoria'未定义
排查部署到Vercel后Prismic数据获取失败的问题
这个错误TypeError: Cannot read property 'titulo_categoria' of undefined很明确:你的组件里尝试访问cat.titulo_categoria,但cat本身是undefined。结合本地正常、部署异常的情况,我们可以从以下几个方向排查:
一、最可能的原因:Vercel环境变量未正确配置
本地运行时你可能在.env文件里配置了Prismic的相关密钥,但部署到Vercel时这些变量不会自动同步,导致API请求失败,最终data为空,cat变成undefined。
解决步骤:
- 打开Vercel项目的Settings -> Environment Variables页面
- 确认以下变量是否和本地
.env文件完全一致:PRISMIC_REPOSITORY_NAMEPRISMIC_API_TOKENPRISMIC_REPOSITORY_LOCALE
- 配置完成后重新触发一次部署(可以手动在Vercel控制台点击"Redeploy")
二、fallback: true导致的空值未处理
你的getStaticPaths设置了fallback: true,这意味着当用户访问未预渲染的路径时,Vercel会实时运行getStaticProps获取数据。如果此时传入的slug在Prismic中不存在,data.categorias会是null,组件直接访问cat.titulo_categoria就会报错。
解决步骤:
在组件中添加空值检查,避免直接访问未定义的属性:
export default function Index({cat}) { // 处理cat为空的情况 if (!cat) { return <div>分类不存在或加载中...</div>; } // 额外给titulo_categoria加可选链,防止字段结构异常 return <>{cat.titulo_categoria?.[0]?.text}</>; }
三、API请求或查询逻辑问题
本地和部署环境的请求可能存在差异,比如语言参数不匹配、查询语法错误等。可以通过日志排查:
解决步骤:
- 在
getStaticProps中添加日志,打印关键数据:
export async function getStaticProps({params}) { console.log("当前请求的slug:", params.slug); const data = await getCategory2(params.slug); console.log("Prismic返回的数据:", data); return { props: { cat: data?.categorias ?? null, }, }; }
- 部署后查看Vercel的Deployment Logs,确认:
params.slug是否符合预期data是否包含categorias字段
- 到Prismic的GraphQL Playground中测试你的查询,传入部署环境中使用的
slug和lang参数,看是否能正常返回数据:
query CategoryBySlug($slug: String!, $lang: String!) { categorias(uid: $slug, lang: $lang) { titulo_categoria _meta { uid } } }
四、API Token权限问题
如果你的Prismic API Token是预览专用的(而非永久访问令牌),部署环境可能无法正常读取数据。确认你在Vercel中配置的是Prismic的永久访问令牌,并且该令牌拥有读取数据的权限。
内容的提问来源于stack exchange,提问作者Esteban89




