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

React应用Post请求传空对象问题求助(附前后端代码)

问题原因与解决方法

核心问题1:Fetch API 请求体参数错误

前端使用fetch发送POST请求时,错误地用data字段传递请求体内容,但Fetch API规范中,请求体必须通过body字段传递。这直接导致后端无法解析到任何数据,拿到空的request.body。

核心问题2:状态更新时机逻辑瑕疵

当前代码在!duplicate分支里先调用setName等清空表单状态,虽然React状态更新是异步的,当前函数内的name等变量还保留旧值,但这种逻辑顺序容易引发混淆,建议调整为先发送请求,再清空状态。


修改后的前端代码(关键部分)

const handleSubmit = (e) => {
  e.preventDefault();
  
  if(!duplicate){
    // 先保存要提交的联系人数据
    const contactData = { name, phone, email };
    
    // 先调用props添加联系人到前端状态
    props.addContacts(name,phone,email);
    
    // 发送POST请求,修正为body字段传递请求体
    fetch('http://localhost:5000/api/contacts', {
      method: 'POST',
      mode: 'cors',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(contactData) // 这里把data改成body
    }).then(() => {
      console.log(contactData);
    }).catch(error => {
      console.error(error);
    });
    
    // 最后清空表单状态
    setName('');
    setPhone('');
    setEmail('');
  }
};

后端代码优化建议

当前后端用response.redirect处理POST请求响应,对于前端fetch请求来说,重定向体验并不友好,建议改为返回JSON格式的成功响应:

app.post('/api/contacts', (request, response, next) => {
    const { name, email, phone } = request.body;
    
    pool.query(
        'INSERT INTO contacts(name, phone, email) VALUES($1, $2, $3)',
        [name,phone,email],
        (err, res) => {
            if (err) return next(err);
            // 替换redirect为JSON响应
            response.status(201).json({ 
              message: '联系人添加成功',
              contact: { name, phone, email }
            });
        }
    );
});

内容的提问来源于stack exchange,提问作者Avishek Chakrabarty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:50:45