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

Node.js出现SyntaxError: Unexpected token i in JSON at position 20报错如何解决

问题排查与解决方案

核心原因定位

  • 报错来源于express.json()中间件:该中间件会自动解析所有请求头携带Content-Type: application/json的请求体,将其转为JS对象。你调用GET接口时,要么是请求携带了不符合JSON格式的请求体,要么是请求头错误标记了Content-Type为application/json但实际请求体不是合法JSON,部分场景下GET请求携带请求体本身就会触发该中间件的异常解析。
  • 你之前尝试的处理返回数据的JSON.parse、JSON.stringify操作不生效,因为错误发生在请求进入你的接口业务逻辑之前,是中间件解析请求阶段抛出的异常,和接口返回值无关。
  • 所有本地项目都触发问题的高频原因:你本机近期安装了全局代理/抓包工具、浏览器请求篡改插件,或是系统级的网络拦截程序,自动给所有请求加了错误的请求头/请求体内容。

分步解决步骤

  1. 验证中间件触发逻辑
    临时注释掉app.use(express.json())这行代码,再次调用GET接口,如果接口正常返回数据,即可确认是该中间件的解析触发了问题。
  2. 排查调用端的请求参数
    检查你调用该GET接口的方式(Postman/浏览器/前端代码等):
  • 确认GET请求没有携带任何请求体
  • 确认请求头没有手动设置Content-Type: application/json
  1. 排查本机全局网络影响
  • 关闭所有正在运行的抓包工具、VPN、代理软件,禁用所有浏览器请求篡改类插件
  • 用系统自带的curl工具发起请求验证,cmd执行:curl http://localhost:3000,看是否还报错
  1. 修复接口兼容逻辑
    如果后续你确实需要保留express.json()中间件处理POST等请求,可以调整中间件的生效规则,仅对非GET请求启用:
// 替换原来的app.use(express.json())
app.use((req, res, next) => {
  if (req.method !== 'GET' && req.headers['content-type']?.includes('application/json')) {
    express.json()(req, res, next)
  } else {
    next()
  }
})
  1. 验证返回数据合法性
    如果上述步骤都做了还是报错,在服务端打印knex返回的内容,确认查询结果没有包含特殊不可见字符:
app.get('/', async (req, res)=>{
    const catalog = {
        kitchen: await knex('kitchen').distinct('item_group'),
        bedroom: await knex('bedroom').distinct('item_group'),
        living_room: await knex('living_room').distinct('item_group'),
        kidsroom: await knex('kidsroom').distinct('item_group'),
        bathroom: await knex('bathroom').distinct('item_group'),
        accessories: await knex('accessories').distinct('item_group')
    }
    console.log('查询结果:', JSON.stringify(catalog)) // 打印看是否是合法JSON
    res.json(catalog)
})

内容的提问来源于stack exchange,提问作者jkalandarov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:06:03