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

Typescript报错:JSON位置4后存在意外非空白字符,页面数据收集失败

Next.js构建时getStaticProps/getStaticPaths JSON解析错误排查方案

核心问题定位

错误提示里的SyntaxError: Unexpected non-whitespace character after JSON at position 4,本质是调用res.json()时,后端返回的内容不是合法JSON格式——大概率是构建时本地后端服务没启动,导致fetch返回了浏览器的错误HTML页面;或者后端接口输出了额外的非JSON字符(比如调试日志、代码报错的栈追踪文本)。

具体排查&修复步骤

  • 构建前必须启动后端服务:代码里硬编码了http://localhost:5000,Next.js静态构建阶段会真实发起请求,如果本地5000端口的服务没跑,请求会失败,返回的是HTML错误页面,自然解析JSON报错。先启动后端,确保http://localhost:5000/products和带id的接口能返回合法JSON。
  • 直接检查后端接口返回内容:用浏览器或Postman访问这两个接口,确认:
    1. 返回的是纯JSON,没有多余的字符(比如后端console.log输出的内容、语法错误提示);
    2. JSON格式合法(键用双引号、没有末尾多余逗号、字符串用双引号);
    3. 请求不存在的productid时,后端返回的是JSON格式的错误信息,而非HTML页面。
  • 给fetch加文本兜底排查:在解析JSON前先把响应转成文本,打印出来方便定位异常:
    const res = await fetch(`http://localhost:5000/products/${productid}`);
    if (!res.ok) {
      const rawText = await res.text();
      console.error('后端返回的原始内容:', rawText); // 构建时看日志就能知道问题
      throw new Error(`请求失败: ${res.status} ${res.statusText}`);
    }
    const product: productInterface = await res.json();
    
  • 验证product._id的有效性:检查/products接口返回的_id是不是都是有效字符串,有没有空值或非字符串类型——如果_id无效,生成的paths参数会有问题,导致后续请求的productid不合法,后端返回错误内容。
  • 用环境变量替代硬编码地址:把后端地址放到.env.local的NEXT_PUBLIC_API_URL里,避免硬编码,也方便生产环境切换:
    const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/products`);
    

临时调试技巧

如果不想在构建时启动全量后端服务,可以临时修改getStaticPaths,只预渲染单个测试页面,先验证逻辑:

export const getStaticPaths: GetStaticPaths = async () => {
  return { paths: [{ params: { productid: "你的测试id" } }], fallback: true };
};

内容的提问来源于stack exchange,提问作者Rihanul Islam Sharif

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:45:08