Mongoose/MongoDB数组push方法未定义报错问题求助
嘿,我来帮你搞定这个「push is undefined」的坑!这个错误说白了就是你想调用push的东西要么不是数组,要么根本不存在。结合你的Mongoose模型,我整理了几个最可能的原因和对应的解决办法:
可能的原因及修复方案
1. workRating字段没被初始化为空数组
你的Schema里虽然定义了workRating是数组类型,但Mongoose默认不会自动给新创建的文档初始化这个字段——如果创建Work的时候没给workRating赋值,它就会是undefined,这时候调用push肯定报错。
怎么修:
要么在Schema里直接给workRating加默认值:
var WorkSchema = new mongoose.Schema({ title: String, genre: String, workType: String, length: Number, ageRange: String, author: { id: { type: mongoose.Schema.Types.ObjectId, ref: "User" }, username: String }, manuscriptText: String, // 给数组加默认空数组 workRating: { type: [{ reviewerName: String, critique: String // 这里补全你其他的评论字段 }], default: [] } });
要么在创建新Work文档的时候手动初始化:
const newWork = new Work({ title: "你的书名", genre: "小说", // 其他必填字段... workRating: [] // 手动设为空数组 }); await newWork.save();
2. 你操作的不是Mongoose文档实例
如果查询的时候用了lean(),或者把文档转成了普通JSON对象,那这个对象的workRating要么是普通数组,要么是undefined——尤其是undefined的时候,调用push就会报错。另外,普通对象调用save()也不会生效,这点要注意。
怎么修:
- 查文档的时候别用
lean():
// 错误示范:用lean()返回的是普通JS对象 const work = await Work.findOne({ title: "你的书名" }).lean(); // 正确做法:返回Mongoose的Document实例 const work = await Work.findOne({ title: "你的书名" });
- 如果确实要处理普通对象,先检查
workRating是否存在,不存在就先初始化:
if (!work.workRating) { work.workRating = []; } work.workRating.push({ reviewerName: "J.G.Sable", critique: "这书值得一读!" }); // 如果是Document实例,直接save;如果是普通对象,要用findByIdAndUpdate更新 await work.save();
3. 字段名拼写错了!
别笑,这真的是高频坑!比如不小心把workRating写成了workrating(小写r)或者workRatings(多了个s),那你访问的就是一个不存在的属性,自然是undefined,调用push肯定报错。
怎么修:
把所有操作这个字段的代码都检查一遍,确保字段名和Schema里的workRating完全一致:
// 错误:拼写不对 work.workrating.push(...) // 正确:和Schema里的名字一致 work.workRating.push(...)
额外调试小技巧
实在找不到问题的话,在调用push之前先打印一下work.workRating,看看它到底是什么:
console.log("当前workRating的值:", work.workRating); console.log("当前workRating的类型:", typeof work.workRating);
这样就能一眼看出是undefined、null还是正常数组了。
内容的提问来源于stack exchange,提问作者J.G.Sable
相关产品推荐
相关产品推荐

