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访问这两个接口,确认:
- 返回的是纯JSON,没有多余的字符(比如后端console.log输出的内容、语法错误提示);
- JSON格式合法(键用双引号、没有末尾多余逗号、字符串用双引号);
- 请求不存在的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
相关产品推荐
相关产品推荐

