Postman中POST请求正常 浏览器React提交MongoDB时FormData为空
问题根源
- 核心配置冲突:你提交的请求体是
FormData格式,但请求头强制指定了Content-Type: application/json,后端按照JSON格式解析请求体时无法识别FormData结构,导致所有字段读取为空,触发MongoDB的必填校验报错。 - Axios序列化规则限制:Axios不会自动将FormData实例序列化为JSON格式,直接传入FormData给JSON类型的请求,实际提交的是空对象,后端自然读不到字段值。
解决方案
方案1:纯文本字段场景直接用JSON提交(推荐)
你的表单只有普通文本字段,不需要用到FormData,直接提交普通JS对象即可,和你Postman测试的提交格式完全一致。
修改CreateUser.js的submitHandler方法:
const submitHandler = (e) => { e.preventDefault(); // 直接构造普通JS对象,无需FormData const userData = { firstName, lastName, email }; dispatch(createNewUser(userData)); };
UserActions.js的现有配置无需修改,即可正常请求。
方案2:需要保留FormData场景(如后续要上传文件)
如果你需要用FormData承载文件等二进制内容,修改UserActions.js的请求配置:
- 删除手动设置的
Content-Type: application/json,Axios会自动识别FormData实例,自动设置正确的multipart/form-data请求头,且会自动携带boundary分隔符参数,手动设置请求头会丢失该参数导致解析失败。 - 确保后端已配置
multipart/form-data格式的解析中间件(如Express生态的multer)。
修改后的UserActions.js代码:
export const createNewUser = (userData) => async (dispatch) => { try { // 移除手动设置的Content-Type,由Axios自动处理 const { data } = await axios.post("/api/v1/user/new", userData); dispatch({ payload: data }); } catch (error) { console.log(error.response); } };
内容的提问来源于stack exchange,提问作者odin_allfather
相关产品推荐
相关产品推荐

