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

使用Node.js+Mongoose开发播客API时Episodes数组为空问题求助

解决播客API中Mongoose Episodes数组存入为空的问题

问题背景

使用Node.js、Mongoose和Postman开发播客API,API包含CategoryName字段和Episodes数组(数组元素包含EpisodeNo、EpisodeName、EpisodeDescription及标题图片)。提交数据后CategoryName能正常存入,但Episodes数组始终为空。

原代码与Schema

原创建API代码

const Create = async(req,res)=>{
    const CategoryName = req.body.CategoryName
    const EpisodeNo = req.body.EpisodeNo
    const EpisodeName = req.body.EpisodeName
    const EpisodeDescription = req.body.EpisodeDescription

    try{
        if(req.file){
            const file = dataUri(req).content;
            const result = await uploader.upload(file)
            const image = result.url;
            const Podcast = new Podcasts({
                CategoryName:CategoryName,
                EpisodeNo:EpisodeNo,
                EpisodeName:EpisodeName,
                EpisodeDescription:EpisodeDescription,
                imageurl:image
            })
            console.log(imageurl)
            await Podcast.save()
            res.send(Podcast)
        }
    }catch(err){
        res.status(500).json(err)
        console.log(err)
    }
}

Mongoose Schema定义

const PodcastSchema = new mongoose.Schema({
        CategoryName:String,
        Episodes:[
            {
                EpisodeNo:Number,
                EpisodeName:String,
                EpisodeDescription:String,
                imageurl:String
        }
        ]
    },
    {
        timestamps:true
    })

API返回结果示例

{
"_id": "6472e8d3b36c95432b4758fc",
"CategoryName": "Music",
"Episodes": [],
"createdAt": "2023-05-28T05:38:27.135Z",
"updatedAt": "2023-05-28T05:38:27.135Z",
"__v": 0
}

问题原因分析

原代码核心问题是数据结构与Schema不匹配:

  • Schema中EpisodeNo、EpisodeName、EpisodeDescription、imageurl是嵌套在Episodes数组的子对象中的字段
  • 创建Podcasts实例时,却将这些字段作为顶级属性传入,Mongoose会忽略Schema未定义的顶级字段,导致Episodes数组始终为空。

修复方案(可运行代码)

const Create = async(req,res)=>{
    const {CategoryName} = req.body

    try{
        if(req.file){
            const file = dataUri(req).content;
            const result = await uploader.upload(file)
            const image = result.url;
            const Podcast = new Podcasts({
                CategoryName:CategoryName,
                Episodes:[{
                    EpisodeNo:req.body.EpisodeNo,
                    EpisodeName:req.body.EpisodeName,
                    EpisodeDescription:req.body.EpisodeDescription,
                    imageurl:image
                }]
            })
            const Podcastresult = await Podcast.save()
            res.send(Podcastresult)
        }
    }catch(err){
        res.status(500).json(err)
        console.log(err)
    }
}

修复逻辑说明:

  1. 将EpisodeNo、EpisodeName等字段包装到Episodes数组的子对象中,与Schema结构完全匹配
  2. 确保Mongoose能正确识别并存储嵌套数组数据

进一步优化建议

如果需要支持一次性提交多个剧集,可以修改Postman的提交方式,将Episodes作为数组提交(使用JSON格式请求体),同时调整代码逻辑:

const Create = async(req,res)=>{
    const {CategoryName, Episodes} = req.body

    try{
        // 如果有上传的图片,给每个剧集添加imageurl(根据业务需求调整)
        if(req.file){
            const file = dataUri(req).content;
            const result = await uploader.upload(file)
            const image = result.url;
            // 给每个剧集设置图片地址
            const episodesWithImage = Episodes.map(ep => ({...ep, imageurl: image}))
            const Podcast = new Podcasts({
                CategoryName,
                Episodes: episodesWithImage
            })
            const Podcastresult = await Podcast.save()
            res.send(Podcastresult)
        } else {
            // 无图片时直接存储
            const Podcast = new Podcasts({
                CategoryName,
                Episodes
            })
            const Podcastresult = await Podcast.save()
            res.send(Podcastresult)
        }
    }catch(err){
        res.status(500).json(err)
        console.log(err)
    }
}

此时Postman需选择raw->JSON格式,请求体示例:

{
    "CategoryName": "Music",
    "Episodes": [
        {
            "EpisodeNo": 1,
            "EpisodeName": "Episode 1",
            "EpisodeDescription": "First episode"
        },
        {
            "EpisodeNo": 2,
            "EpisodeName": "Episode 2",
            "EpisodeDescription": "Second episode"
        }
    ]
}

内容的提问来源于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 09:02:45