为何在Mongoose Populate中使用Select会出现未定义错误?
解决方案
问题根源
你遇到的问题大概率是后续代码访问了author或category中你没在select里指定的字段。虽然控制台能打印出posts数据,但控制台输出的是Mongoose文档对象,未被select指定的字段会是undefined——后续代码一旦尝试访问这些undefined属性的子属性,就会触发“cannot read properties of undefined”错误。
排查与修复步骤
- 检查后续处理逻辑:找到获取posts后对其进行处理的代码,确认是否有访问
author/category中未在select声明的属性。比如你只给author选了name,但后续代码里写了post.author._id,那必然会报错。 - 修正
populate的select参数:把后续需要用到的字段全部加入select列表,示例代码:async function getAllPosts() { try { const posts = await Post.find() .populate({ path: 'author', select: 'name email _id' // 列出所有后续要用到的字段 }) .populate({ path: 'category', select: 'title description _id' }); // 后续处理逻辑仅访问上述select指定的字段 return posts; } catch (err) { throw err; } } - 规范
select语法:尽量不要混用包含和排除字段(除非是排除少数敏感字段,比如select: '-password'表示除password外的所有字段都返回)。比如select: 'name -_id'会主动排除_id,如果后续代码需要用到_id就会出错。
额外提示
如果不确定后续需要哪些字段,可以先不限制select,打印单个post的完整结构,梳理出实际用到的字段后,再把这些字段加入select列表。
内容的提问来源于stack exchange,提问作者Nikhil
相关产品推荐
相关产品推荐

