2023-06-25 11:30:35
在Node.js的request模块中,json参数用于自动将请求体序列化为JSON格式并设置正确的Content-Type头(application/json)。当json参数设为true时,模块会尝试对请求体进行JSON序列化,但如果请求体已经是字符串,会导致双重序列化或格式错误,从而引发服务器解析问题。
以下是关键点总结:
json: true的作用
自动将请求体(对象)转换为JSON字符串。
设置请求头Content-Type: application/json。
若请求体已是字符串,仍会强制调用JSON.stringify(),导致格式错误(如字符串被转义为"...")。
问题复现
用户代码中请求体是字符串,但设置了json: true,导致模块对字符串再次序列化,生成无效的JSON格式。
服务器因此无法正确解析Content-Type或请求体内容,返回内部错误。
解决方案
若请求体是字符串:设置json: false(或省略),手动确保字符串是合法JSON。
request.post({ url: '若请求体是对象:设置json: true,让模块自动处理序列化。
request.post({ url: '调试建议
检查请求体的实际类型(typeof body)。
使用工具(如Postman或Wireshark)对比正常与异常请求的Content-Type和请求体格式。
底层逻辑
模块内部通过safeStringify(即JSON.stringify)处理序列化。若输入非对象且json: true,会生成不符合预期的结果(如字符串被包裹引号)。
总结:json参数需与请求体类型严格匹配。字符串请求体应禁用自动序列化(json: false),对象请求体则启用(json: true)。此坑常见于混合使用字符串模板或预序列化数据时。