Express服务器无法接收浏览器PUT请求体,REST客户端可正常工作
解决思路
1. 检查Fetch请求的Content-Type头
Express的express.json()(或旧版的body-parser)只会解析Content-Type为application/json的请求体。浏览器端用fetch发送JSON时,不会自动添加这个请求头,但REST客户端(如Insomnia)会自动补上。
你需要在fetch的配置里显式设置该请求头:
fetch('/job/like', { method: 'PUT', headers: { 'Content-Type': 'application/json', // 必须添加这个关键头 // 若有认证需求,别忘了带上Authorization等相关头 }, body: JSON.stringify({ id: 865058, turnon: false }) })
2. 确认Express的JSON解析中间件配置
尽管POST请求正常,仍需确认你的Express应用是否全局配置了JSON解析中间件,且未对PUT方法做特殊限制:
// 务必在所有路由之前添加这个中间件 app.use(express.json()); // 如需处理较大请求体,可设置大小限制 // app.use(express.json({ limit: '10mb' }));
注意:不要重复配置express.json()和body-parser.json(),二者功能一致,重复配置可能导致异常。
3. 排查中间件是否拦截请求体
检查authed或catchErrors这类自定义中间件,是否在处理PUT请求时意外修改或清空了req.body。可以临时注释这些中间件,直接测试路由是否能获取到请求体,以此定位是否为中间件的问题。
4. 验证浏览器请求的实际发送内容
在浏览器开发者工具的「网络」面板中,查看PUT请求的细节:
- 确认
Content-Type请求头是否为application/json - 确认请求体格式正确,没有被转义、截断或异常编码
内容的提问来源于stack exchange,提问作者Maddy Guthridge
相关产品推荐
相关产品推荐

