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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:37:34