如何使用Mongoose和Node.js向MongoDB的数组字段插入数据
问题原因
- Schema语法错误
你定义的publisherSchema中,website字段结束后缺少逗号,属于语法错误,会影响字段正常解析。 - 请求参数格式不匹配
报错Cast to embedded failed是因为你POST请求里传的games是字符串类型,但Schema中定义的games是包含date、name属性的对象数组,类型不匹配导致Mongoose转义失败。
修复步骤
1. 修正publisher.js的Schema语法
const mongoose = require('mongoose'); const publisherSchema = new mongoose.Schema({ company_name:{ type: String }, website:{ type: String }, // 此处补全缺失的逗号 games: [{ date: Date, name: String }] }); const publisher = mongoose.model('Publisher',publisherSchema); module.exports = publisher;
2. 调整POSTMAN的请求参数格式
POST请求选择raw + JSON格式,请求体示例如下:
{ "company_name": "Rockstar Games", "website": "https://rockstargames.com", "games": [ { "name": "San and", "date": "2004-10-26T00:00:00.000Z" }, { "name": "GTA V", "date": "2013-09-17T00:00:00.000Z" } ] }
3. 可选:添加参数校验(避免格式错误)
可以在server.js的接口中增加参数校验逻辑,提前拦截格式错误的请求:
app.post('/publish',async (req,res) => { const { company_name,website,games } = req.body; // 校验games格式 if (games && !Array.isArray(games)) { return res.status(400).send('games必须为数组格式'); } if (games && games.some(item => !item.name || !item.date)) { return res.status(400).send('games数组每个元素必须包含name和date字段'); } const insert = new publisher({company_name,website,games}); try{ const data = await insert.save(); res.send(data); } catch(err) { console.log(err); res.status(500).send('保存失败:' + err.message); } });
内容的提问来源于stack exchange,提问作者Digvijay Singh Thakur
相关产品推荐
相关产品推荐

