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

POST请求req.body正常,PUT请求更新数组时遇未定义及返回异常

问题解决:MongoDB数组更新时req.body属性未定义、返回仅含_id的问题

核心错误诊断

  1. 请求体属性路径错误
    从控制台输出可见,前端传入的req.body结构为{Episodes: {EpisodeNo: ...}},但代码直接尝试读取bodycontent.EpisodeNo,跳过了外层的Episodes对象,导致属性值为undefined。

  2. updateOne方法的返回值与配置问题

    • updateOne默认返回的是操作结果对象(包含匹配数、修改数等),而非更新后的完整文档,这就是你只收到_id的原因。
    • new: true选项仅对findByIdAndUpdate/findOneAndUpdate这类方法生效,对updateOne无效,属于无效配置。

修正后的代码方案

方案一:使用findByIdAndUpdate(推荐,直接返回更新后文档)

const Update = async (req, res) => {
    const _id = req.params.id
    const { Episodes } = req.body // 解构获取嵌套的Episodes对象

    try {
        const UpdatedPodcast = await Podcasts.findByIdAndUpdate(
            _id,
            {
                $push: {
                    Episodes: {
                        EpisodeNo: Episodes.EpisodeNo,
                        EpisodeName: Episodes.EpisodeName,
                        EpisodeDescription: Episodes.EpisodeDescription
                    }
                }
            },
            {
                upsert: true,
                new: true // 此选项在这里生效,返回更新后的完整文档
            }
        )
        console.log(Episodes.EpisodeNo, Episodes.EpisodeName, Episodes.EpisodeDescription)
        console.log(req.body)
        res.send(UpdatedPodcast)
    } catch (err) {
        res.status(500).json({
            message: "Error in updating the data"
        })
    }
}

方案二:保留updateOne,手动查询更新后文档

如果坚持使用updateOne,需要在更新完成后手动查询最新文档:

const Update = async (req, res) => {
    const _id = req.params.id
    const { Episodes } = req.body

    try {
        await Podcasts.updateOne(
            { _id },
            {
                $push: {
                    Episodes: {
                        EpisodeNo: Episodes.EpisodeNo,
                        EpisodeName: Episodes.EpisodeName,
                        EpisodeDescription: Episodes.EpisodeDescription
                    }
                }
            },
            { upsert: true } // 移除无效的new:true配置
        )
        // 更新后查询最新文档
        const UpdatedPodcast = await Podcasts.findById(_id)
        console.log(Episodes.EpisodeNo, Episodes.EpisodeName, Episodes.EpisodeDescription)
        console.log(req.body)
        res.send(UpdatedPodcast)
    } catch (err) {
        res.status(500).json({
            message: "Error in updating the data"
        })
    }
}

关键改动说明

  • 修正属性读取路径:通过解构req.body.Episodes获取嵌套字段,确保能正确读取前端传入的EpisodeNo等参数。
  • 选择合适的更新方法:findByIdAndUpdate支持直接返回更新后的文档,无需额外查询;若使用updateOne,必须手动查询才能拿到完整文档。
  • 移除无效配置:删除updateOne中无效的new: true选项,避免冗余配置。

额外验证

确认你的Podcasts模型中,Episodes字段定义为数组类型,例如:

const PodcastSchema = new mongoose.Schema({
    // 其他字段...
    Episodes: [{
        EpisodeNo: Number,
        EpisodeName: String,
        EpisodeDescription: String
    }]
})

只有数组类型才能正确使用$push操作符添加元素。

内容的提问来源于stack exchange,提问作者FARHAN KHAN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:35:10