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操作不生效,因为错误发生在请求进入你的接口业务逻辑之前,是中间件解析请求阶段抛出的异常,和接口返回值无关。 - 所有本地项目都触发问题的高频原因:你本机近期安装了全局代理/抓包工具、浏览器请求篡改插件,或是系统级的网络拦截程序,自动给所有请求加了错误的请求头/请求体内容。
分步解决步骤
- 验证中间件触发逻辑
临时注释掉app.use(express.json())这行代码,再次调用GET接口,如果接口正常返回数据,即可确认是该中间件的解析触发了问题。 - 排查调用端的请求参数
检查你调用该GET接口的方式(Postman/浏览器/前端代码等):
- 确认GET请求没有携带任何请求体
- 确认请求头没有手动设置
Content-Type: application/json
- 排查本机全局网络影响
- 关闭所有正在运行的抓包工具、VPN、代理软件,禁用所有浏览器请求篡改类插件
- 用系统自带的curl工具发起请求验证,cmd执行:
curl http://localhost:3000,看是否还报错
- 修复接口兼容逻辑
如果后续你确实需要保留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() } })
- 验证返回数据合法性
如果上述步骤都做了还是报错,在服务端打印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
相关产品推荐
相关产品推荐

