为何无法通过Mongoose的populate访问关联对象的子字段?
解决Mongoose Populate后模板无法访问关联文档子字段的问题
这个问题我之前也踩过坑!原因很明确:你通过populate拿到的customerId是Mongoose Document实例,不是普通的JavaScript对象——它带着Mongoose封装的一堆额外属性和getter/setter方法(就是你控制台看到的$、$init这些),模板引擎没法正确解析它的嵌套字段。
给你两个可行的解决方案,优先推荐第一个:
方案1:使用.lean()(推荐,性能更优)
在查询链里加上.lean(),让Mongoose直接返回普通JS对象,这样模板就能正常访问子字段了:
router.get('/list', (req, res) => { Program.find() .populate('customerId') .lean() // 关键:将Mongoose文档转为普通JS对象 .exec((err, docs) => { if (!err) { res.render("program/list", { list: docs }); } else { console.log('Error in retrieving program list :' + err); } }); });
方案2:手动转换为普通对象
如果因为某些原因不能用.lean(),可以在渲染前把每个文档转成普通对象:
router.get('/list', (req, res) => { Program.find().populate('customerId').exec((err, docs) => { if (!err) { // 把每个Mongoose Document实例转为普通JS对象 const plainPrograms = docs.map(program => program.toObject()); res.render("program/list", { list: plainPrograms }); } else { console.log('Error in retrieving program list :' + err); } }); });
改完之后,你在模板里用{{this.customerId.lastName}}就能正常输出客户姓氏了。
另外补充个小技巧:如果用的是EJS这类支持直接调用方法的模板,也可以临时用<%= this.customerId.get('lastName') %>来获取值,但显然转成普通对象的方式更通用,也更符合日常开发习惯。
内容的提问来源于stack exchange,提问作者R H
相关产品推荐
相关产品推荐

