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

MongoDB用户更新失败:后端formData为undefined,无匹配记录

用户信息更新失败问题排查与解决

核心问题分析

从后端日志的Form data undefined和matchedCount:0可以定位两个关键问题:请求体未被正确解析,以及查询条件无法匹配数据库中的用户记录。

解决方案步骤

1. 修复后端请求体解析问题

Express框架默认不会自动解析JSON格式的请求体,这直接导致req.body返回undefined。需要在后端初始化代码中添加JSON解析中间件,且必须放在所有路由定义之前:

// 在app定义后、路由注册前添加
app.use(express.json());

2. 修正查询条件,正确获取用户ID

后端当前通过formData.userId获取用户ID,但前端并未将userId放入请求体,而是通过URL参数/:userId传递。应从req.params中读取URL参数:

// 原错误代码
const query = {user_id: formData.userId}

// 修改后代码
const query = {user_id: req.params.userId}

3. 完善后端代码的错误处理与资源释放

当前后端代码缺少异常捕获后的反馈逻辑,也未关闭MongoDB连接,容易导致资源泄漏和错误无法定位。完善后的代码如下:

app.put('/users/:userId', async (req, res) => {
    const client = new MongoClient(uri)
    const formData = req.body;

    try {
        await client.connect();
        const database = client.db('app-data')
        const users = database.collection('users');
        console.log("Form data", formData);
        
        const query = {user_id: req.params.userId}
        const updateDocument = {
            $set: {
                first_name: formData?.first_name,
                last_name: formData?.last_name,
                birthdate: formData?.birthdate,
                birth_month: formData?.birth_month,
                birth_year: formData?.birth_year,
                gender: formData?.gender,
                major: formData?.major,
                cleanliness: formData?.cleanliness,
                bio: formData?.bio
            },
        }
        const updatedResult = await users.updateOne(query, updateDocument);
        
        // 反馈用户未找到的情况
        if (updatedResult.matchedCount === 0) {
            return res.status(404).json({message: "目标用户不存在"});
        }
        return res.json(updatedResult);
    } catch (err) {
        console.error("更新失败:", err);
        return res.status(500).json({message: "服务器内部错误"});
    } finally {
        // 无论成功失败都关闭数据库连接
        await client.close();
    }
})

4. 前端验证用户ID有效性(可选)

确保前端从localStorage获取的userId不为空,可在提交时添加日志验证:

const handleSubmit = async (e) => {
    e.preventDefault();
    try {
        const userId = localStorage.getItem('userId');
        console.log("当前用户ID:", userId); // 确认userId不为null/undefined
        const response = await axios.put(`http://localhost:8000/users/${userId}`, formData);
        navigate('/feed');
        return response;
    } catch(err) {
        console.log(err);
    }
}

验证修复效果

完成上述修改后:

  • 后端控制台将正常打印Form data的具体内容
  • updateOne返回结果中的matchedCount和modifiedCount会变为1(用户存在且字段有更新时)
  • 数据库中的用户记录将被正确更新

内容的提问来源于stack exchange,提问作者Alexander Buly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 16:25:54