You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 14:09:34