问题描述
最近使用mongoose遇到个错误CastError: Cast to embedded failed for value,搜了一下发现文章很少,于是写篇文章记录一下。
原来代码:
let mongoose = require('./mongodb');
let Schema = mongoose.Schema;
var ArticleSchema = new Schema({
author: { type: String, default: 'admin' }, //作者
time: { type: Date, default: Date.now }, //时间
content: { type: String, required: true }, //内容
img: { type: String, default: 'logo.svg' },
zan: { type: Number, default: 0 },
cai: { type: Number, default: 0 },
read: { type: Number, default: 0 },
category: [String],
///////////////////
// comment这里是重点
///////////////////
comment: [{
name: { type: String, default: '路人' },
time: { type: Date, default: Date.now },
content: { type: String, required: true }
}]
});
module.exports = mongoose.model('Article', ArticleSchema, 'article');
我打算插入一条评论:
router.post('/pushCommentById', async (ctx) => {
const id = ctx.request.body.id
// 新建评论
const comment = {
name: ctx.request.body.name || '路人',
time: Date.now
content: ctx.request.body.content
}
// 插入评论
const data = await Article.findByIdAndUpdate({ '_id': id }, { $push: { comment } }, { new: true });
console.log(data)
ctx.body = data;
})
然后就报错:
解决方式
将Date.now去除掉
const comment = {
name: ctx.request.body.name || '路人',
// time: Date.now,
content: ctx.request.body.content
}
原因分析
我新建的comment的格式与原来Schema里声明的不一样,Scema里的是Date对象,我传入的Date.now是一个函数,类型不同。
Scema里的Date.now是在没有值的情况下执行该函数,并非值是函数。