Mongoose插入含关联字段的Admin文档时role字段丢失问题
解决方案
问题出在Role.findOne({_id: 3})这行代码:Mongoose的查询方法默认返回Promise,你没有用await等待它解析,所以role变量是一个未兑现的Promise对象,而非实际的Role文档。此时访问role._id会得到undefined,Mongoose在创建文档时会自动忽略值为undefined的字段,因此最终插入的Admin文档没有role字段。
修正方法是给Role.findOne加上await关键字:
mongoose.connect("mongodb://127.0.0.1:27017/Test") insertAdmin() async function insertAdmin() { try { // 新增await等待查询结果 const role = await Role.findOne({_id: 3}); console.log("Role: ", role) const admin = await Admin.create({ firstName : "Kate", lastName : "Eagan", email : "vvv@dd.com", role : role._id }) console.log("Admin added"); } catch (err) { console.log(err.message) console.log("Admin NOT added"); } }
额外补充两点优化建议:
- Mongoose默认会将模型名转为小写复数形式,因此Role模型对应的集合应为
roles(全小写)。虽然MongoDB查询时大小写不敏感,但建议保持集合命名与Mongoose默认行为一致。 - 可在查询Role后增加空值判断,避免插入无合法role关联的Admin:
const role = await Role.findOne({_id: 3}); if (!role) { throw new Error("指定ID的角色不存在"); }
内容的提问来源于stack exchange,提问作者user1960836
相关产品推荐
相关产品推荐

