Mongoose访问discriminators返回undefined 如何获取鉴别器列表
问题结论
该现象完全符合Mongoose的设计预期,不属于框架异常。
原因说明
discriminators是Mongoose内置属性,仅挂载在生成鉴别器的根基础Model实例上,用来存储该基础模型下注册的所有子鉴别器的键值映射,不会出现在你自定义的导出对象上。- 控制器中引入的
PropertyModel是你通过module.exports导出的普通JavaScript对象,不是Mongoose生成的Model构造函数本身,这个普通对象没有内置的discriminators属性,直接访问自然返回undefined。 - 打印
PropertyModel时能看到所有子鉴别器模型,是因为你在注册其他子鉴别器时,手动将生成的子模型挂载到了这个导出对象上,属于自定义逻辑,和Mongoose内置的鉴别器存储机制无关。
正确获取所有关联鉴别器的实现方式
访问导出对象中存储的根基础模型(即你定义的Property模型)上的discriminators属性即可,代码示例:
const PropertyModel = require('../models/property'); module.exports.index = async (req, res) => { // 访问根基础模型上的discriminators属性,不要直接访问自定义导出对象 const allDiscriminators = PropertyModel.Property.discriminators; console.log(allDiscriminators); // 返回值为对象格式:{ 鉴别器名称: 对应子Model构造函数 },包含所有已注册的子鉴别器 res.render('properties/index'); }
补充注意点
- 只有根基础模型会维护
discriminators映射表,子鉴别器模型本身(比如示例中的Integer模型)上不存在该属性,访问会返回undefined。 - 如果在调用
Model.discriminator()注册任何子鉴别器之前访问基础模型的discriminators,也会返回undefined,完成至少一个子鉴别器注册后,Mongoose会自动初始化该属性。
内容的提问来源于stack exchange,提问作者amiller_lite
相关产品推荐
相关产品推荐

