为什么我的Fetch POST请求总是返回空对象?
我用Fetch发POST请求给后端,数据用JSON.stringify(data)处理了,也设置了Content-Type: application/json,但后端说收到的请求体是空的,返回空对象。我该怎么排查这个问题?
尝试过:
fetch('/api/submit', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'test' })
})
.then(res => res.json())
.then(data => console.log(data)) // 输出{}
控制台没报错,但后端日志显示req.body是空对象
首先,检查后端是不是用了类似
body-parser的中间件。如果没装或者没正确配置,req.body肯定是空的。比如在 Express 里,你需要这样:如果后端没问题,那就是前端发请求的时候出了岔子。你的代码看起来没啥问题,但试试把 Fetch 请求改成这样,确保每个细节都对得上:
再不行的话,用浏览器开发者工具看看 Network 面板,点开那个请求,确认 Request Payload 是不是正确的 JSON 数据。如果是空的,那问题在前端;如果不是空的,但后端还是收不到,那问题在后端。
还有一种可能是跨域问题导致的预检请求失败,看看 Network 里有没有 OPTIONS 请求。如果有,确保后端支持跨域,比如用
cors中间件:复制过去试试,应该能搞定。如果还不行,再把你后端的代码贴出来,咱们接着找问题。
### 1. 检查Fetch的代码
你的代码看起来没问题,但还是要注意几个点:
-
body确实要用JSON.stringify(),你已经做到了。-
Content-Type设置为application/json也没问题。不过为了确保万无一失,可以加上一个
catch捕获错误,方便调试:### 2. 确认后端是否正确解析了请求体
这里可能是问题的关键。具体来说,后端需要显式地解析
application/json类型的请求体。如果你用的是Node.js + Express,必须引入body-parser中间件(Express 4.16以后已经内置了):如果没有这个中间件,即使前端正确发送了JSON数据,后端的
req.body也会是空对象。### 3. 验证请求头和请求体
有时候浏览器或代理服务器可能会篡改请求头。可以用开发者工具(F12)查看实际发出的请求:
- 打开网络面板(Network)
- 找到对应的POST请求
- 查看Request Headers,确认
Content-Type确实是application/json- 查看Request Payload,确认数据内容没错
如果发现
Content-Type被改成了别的类型(比如text/plain),那可能是其他地方设置了冲突的header。### 4. 换个方式测试后端接口
为了排除前端的问题,可以用Postman或者
curl直接测试后端接口:如果用这种方式能正常收到数据,基本可以确定是前端的问题;如果还是收不到,那就是后端配置有问题。
### 5. 最后再看看跨域问题
虽然你提到控制台没报错,但还是要确认一下。如果前后端域名不同,需要确保后端正确设置了CORS头。比如:
总之,先从后端的请求体解析开始检查,再结合实际发出的请求头和payload验证。按这个思路走下来,基本就能找到原因了。要是还有问题,把具体的后端框架和版本也贴出来,我们继续深挖。