如何解析Insomnia发送的JSON?Fastify中isJSON校验请求体返回false怎么办
报错核心原因
你的isJSON函数一直返回false,根本不是发送的请求体JSON格式有问题,是Fastify的内置解析逻辑和你对req.body的类型预期错配了:
- Fastify 默认就带了JSON请求体的自动解析能力:只要客户端发请求时带了标准的
Content-Type: application/json头,Fastify 会在路由处理函数触发执行前,就把原始的JSON字符串请求体直接解析成原生JS对象,挂载到req.body上,根本不会把原始字符串格式的请求体留到业务逻辑里。 - 你现在传给
isJSON做判断的req.body,已经是解析完成的JS对象,不是字符串。但JSON.parse()只接受字符串类型的入参,传入对象时,方法会先把对象强制转成"[object Object]"的字符串再尝试解析,百分百触发语法错误,走到catch分支返回false。
你可以对照自己的日志验证:如果console.log(str)打印出来的内容是键名不带转义、没有外层包裹引号的JS对象格式,就完全匹配这个问题场景。
解决思路
- 直接删掉这套手动判断逻辑最省事:Fastify 本身就会对格式不合法的JSON请求自动返回400错误,你自己写的
isJSON、checkBody属于重复造轮子,完全可以移除,直接用Fastify内置的Schema能力校验请求体结构即可,比自定义判断逻辑稳定得多。 - 如果确实需要拿到原始的字符串格式请求体做校验,就得在Fastify初始化阶段关闭默认的自动JSON解析配置,或是接入对应插件保留原始请求流的字符串内容,这时候
req.body才是代码预期的字符串类型,原本的isJSON逻辑才能正常运行。 - 如果不想大改现有代码,可以给
isJSON加一层入参类型判断:检测到传入的本身就是对象类型时直接返回true,只有入参为字符串时再执行JSON.parse流程,这个是临时补丁方案,能快速解决报错但没有用到Fastify的原生能力。
内容的提问来源于stack exchange,提问作者Nullndr
相关产品推荐
相关产品推荐

