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

Next.js中用react-query的useMutation提交POST至MongoDB失败

问题原因

你的后端postUser方法试图从req.body中解构formData字段,但前端发送的请求体是直接的{name, email}对象,并没有嵌套在formData属性下,导致后端无法获取到预期字段,触发了“Form data not provided”的错误。

解决方案

两种修复方式任选其一即可:

方式一:修改前端辅助函数,将数据包裹在formData中

调整addUser的请求体结构,把用户数据放在formData字段里:

/*** POST new user ***/
export const addUser = async (formData) => {
    const Options = {
        method: "POST",
        headers: {'Content-Type': 'application/json'},
        // 将数据包裹在formData属性中
        body: JSON.stringify({ formData })
    }

    try {
        const response = await fetch(`${BASE_URL}/api/users`, Options)
        const json = await response.json()
        return json
    } catch(error) {
        console.log(error)
        return error
    }
}

方式二:修改后端控制器,直接使用req.body中的数据

既然前端发送的是平级的name和email,后端可以直接读取req.body,无需解构formData:

/*** POST http://localhost:3000/api/users ***/
// 记得补充导入AddedUser模型,比如:import AddedUser from "../../models/AddedUser"
export async function postUser(req, res) {
    try {
        const formData = req.body
        console.log("API", formData)
        // 校验请求体是否为空
        if(!formData || Object.keys(formData).length === 0) {
            return res.status(400).json({error: "Form data not provided"})
        }

        await AddedUser.create(formData, function(err, data){
            if(err) return res.status(500).json({error: err.message})
            return res.status(200).json(data)
        });
    } catch(error) {
        res.status(500).json({error: error.message})
    }
}

额外注意事项

  • 错误状态码语义修正:原代码用404(资源未找到)返回参数错误,更合理的是用400(请求参数错误);服务器内部错误用500。
  • 补充模型导入:postUser中使用的AddedUser模型需要提前导入,否则会报错。

内容的提问来源于stack exchange,提问作者D.D.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:35:16