React表单无法向MongoDB发起POST请求,提交按钮无响应求助
React表单无法向MongoDB发起POST请求,提交按钮无响应求助
嘿,我看了你的代码,提交按钮没反应大概率是表单验证没通过或者字段绑定有问题,咱们一步步排查解决:
1. 先修复最关键的字段绑定问题
你那个项目名称的TextField没有设置name属性,Formik根本没法捕捉到这个必填字段的值,直接导致yup验证失败,提交被Formik拦截了!赶紧补上:
<TextField id="nombreP" name="project_name" // 必须加上这个,和initialValues里的key对应 value={values.project_name} onChange={handleChange} margin="dense" size="small" />
2. 处理DatePicker的日期格式问题
你用的Dayjs日期对象直接传到FormData里会变成[object Object],后端根本解析不了。把日期转成ISO字符串再存入字段:
// project_start的DatePicker修改onChange <DatePicker id="project_start" name="project_start" value={values.project_start} onChange={(value) => setFieldValue("project_start", value ? value.toISOString() : null, true) } slotProps={{ textField: { size: "small", margin: "dense" }, }} />
project_end的DatePicker做同样的修改就行。
3. 正确处理FormData中的数组字段
你的usersId是数组,直接用formData.append只会把数组转成字符串(比如["张三","李四"]变成"张三,李四"),后端很难解析成数组格式。改成循环append:
const postProject = async (values, onSubmitProps) => { const formData = new FormData(); for (let key in values) { const value = values[key]; if (Array.isArray(value)) { // 数组字段分多次append,适配后端的数组解析规则 value.forEach(item => { formData.append(`${key}[]`, item); }); } else { formData.append(key, value); } } try { const savedUserResponse = await fetch( "http://localhost:5001/client/projects", { method: "POST", body: formData } ); // 一定要检查请求是否成功 if (!savedUserResponse.ok) { throw new Error(`请求失败,状态码:${savedUserResponse.status}`); } const result = await savedUserResponse.json(); console.log("项目保存成功:", result); onSubmitProps.resetForm(); } catch (error) { console.error("提交出错:", error); // 这里可以加个用户提示,比如弹出Toast告知提交失败 } };
加个try/catch也很重要,不然请求出错了你连日志都看不到。
4. 检查Select组件的value是否符合后端预期
看你的Select选项,比如partnerId的MenuItem,你把value设成了partner_name,但后端大概率需要的是数据库的_id而不是名称。如果后端要求存ID,改成这样:
{data2?.map(({ _id, partner_name }) => ( <MenuItem key={_id} value={_id}> {partner_name} </MenuItem> ))}
usersId和categoryId的Select也做同样修改,这样传到后端的才是能和数据库关联的正确ID。
5. 验证Formik的验证状态
可以在Formik的render函数里加个日志,看看是不是验证没通过导致提交被拦截:
{({ values, handleChange, handleSubmit, setFieldValue, errors, touched }) => ( <> {console.log("验证错误:", errors, "已填写字段:", touched)} <form onSubmit={handleSubmit}> {/* 表单内容 */} </form> </> )}
如果控制台输出了errors,说明某个字段没通过验证(比如项目名称为空、日期不符合要求),这时候Formik会阻止提交。
最后测试的时候记得打开浏览器开发者工具(F12)的Network标签:
- 如果提交时没发起POST请求,就是验证没通过;
- 如果有请求,看FormData里有没有所有字段,状态码是不是200。
备注:内容来源于stack exchange,提问作者Valentina Loaiza
相关产品推荐
相关产品推荐

