Next.js部署时getStaticPaths函数执行失败,报JSON解析错误:Unexpected token < in JSON at position 0(本地运行正常)
解决Next.js部署时getStaticPaths的JSON解析错误(Unexpected token <)
这个问题我之前帮好几个开发者排查过,核心原因其实很清晰:你在构建阶段调用的API返回的不是JSON数据,而是HTML内容,导致JSON.parse解析失败,出现Unexpected token <(因为HTML文档的开头就是<)。
为什么本地开发没问题?
本地开发时,你的Next.js前端和API路由是在同一个服务里运行的,fetch调用目标API地址能正常拿到JSON响应。但部署到Vercel这类平台时,getStaticPaths是在构建阶段执行的——这时候你的应用还没部署完成,那个API地址返回的大概率是Vercel的404页面(HTML格式),自然解析不了JSON。
解决方案(按优先级排序)
1. 直接对接数据源(最推荐)
跳过API路由这一层,在getStaticPaths里直接读取你的数据源(比如数据库、本地JSON文件、CMS等)。这样既避免了构建时API不可用的问题,还能减少一次网络请求,提升构建效率。
举个例子,如果你的API路由是从MongoDB取数据,那可以直接在getStaticPaths里查询数据库:
// 导入你的数据模型 import Annonce from '../models/Annonce'; export async function getStaticPaths() { // 直接查询数据库,替代fetch API const annonces = await Annonce.find({}); const paths = annonces.map(item => ({ params: { annonce: item._id.toString() } // 确保_id是字符串类型 })); return { paths, fallback: false }; }
2. 调整静态生成策略
如果你的数据是动态更新的,或者构建时无法获取全量数据,可以把fallback设置为true或'blocking':
fallback: true:构建阶段只生成部分页面,其他页面在用户首次访问时动态生成并缓存fallback: 'blocking':用户访问未预生成的页面时,会等待页面生成完成再返回(不会显示loading状态)
这种方式下,getStaticPaths不需要返回所有路径,只需要返回一部分即可,避免构建时依赖未部署的API:
export async function getStaticPaths() { // 可以返回一个空数组或者部分热门路径 return { paths: [], fallback: 'blocking' }; }
3. 调试技巧:确认响应内容
如果不确定问题出在哪里,可以在构建时打印API返回的内容,看看是不是HTML:
export async function getStaticPaths(){ const datas = await fetch(`https://mydomain.vercel.app/api/annonces/annonces`); // 先获取文本内容,而不是直接解析JSON const responseText = await datas.text(); console.log('API响应内容:', responseText); // 部署时查看构建日志 // 之后再尝试解析(如果确认是JSON的话) const annonces = JSON.parse(responseText); const paths = annonces.map(item =>({ params: {annonce: item._id} })); return { paths, fallback: false }; }
内容的提问来源于stack exchange,提问作者Camille
相关产品推荐
相关产品推荐

