如何通过编程获取Mongoose中User模型的可用鉴别器列表?
获取Mongoose基础模型的鉴别器信息
当然可以!Mongoose 给基础模型提供了内置的属性来获取已注册的鉴别器信息,同时也有灵活的替代方案,下面给你详细说明:
方法一:使用Mongoose内置的discriminators属性
Mongoose的基础模型(比如你的User模型)会自动维护一个discriminators对象,里面存储了所有通过User.discriminator()创建的继承模型。你可以直接访问这个对象来获取鉴别器的名称和数量:
具体实现
修改你的usersController.js里的userCreateCallback函数:
userCreateCallback: function(req,res){ // 先判断discriminators是否存在,避免无鉴别器时报错 const discriminators = User.discriminators || {}; // 获取所有鉴别器名称(也就是你的角色名称) const roles = Object.keys(discriminators); // 获取鉴别器数量 const roleCount = roles.length; // 传给渲染的视图 res.render('user/create', { roles: roles, roleCount: roleCount }); }
说明
User.discriminators是一个键值对对象:键就是你创建鉴别器时传入的名称(比如"Client"、"Employee"),值对应的是该鉴别器的模型实例。- 使用
Object.keys()可以快速提取所有鉴别器的名称,也就是你需要的角色列表。 - 提前判断
User.discriminators是否存在是个好习惯,避免当没有创建任何鉴别器时出现Cannot convert undefined or null to object的错误。
方法二:自定义维护角色列表(替代方案)
如果需要更灵活的控制(比如后续要动态添加/移除角色,或者需要额外存储角色的描述信息),可以在创建鉴别器时手动维护一个角色列表:
修改models/user.js
var mongoose = require('mongoose'); var Schema = mongoose.Schema; var options = {discriminatorKey: 'role'}; var userSchema = mongoose.Schema({ name: String, email: String, password: String, },options); var User = mongoose.model('User', userSchema); // 自定义属性来存储可用角色(可扩展为对象数组,包含更多信息) User.availableRoles = []; var Client = User.discriminator("Client", mongoose.Schema({ Address : String, Tax_identification : String, Phone_number : String, Internal_Remarks : String, CRM_status : String, Recent_contact : String, })); // 将角色名称添加到自定义列表 User.availableRoles.push(Client.modelName); var Employee = User.discriminator("Employee",mongoose.Schema({ Staff_Id: String, })); User.availableRoles.push(Employee.modelName); module.exports = {User: User, Client: Client, Employee: Employee };
在控制器中使用
userCreateCallback: function(req,res){ // 直接获取自定义维护的角色列表 const roles = User.availableRoles; const roleCount = roles.length; res.render('user/create', { roles: roles, roleCount: roleCount }); }
优势
- 可以轻松扩展为存储角色的更多元信息,比如:
User.availableRoles.push({ name: Client.modelName, label: '客户', description: '外部客户角色' }); - 对角色的管理更主动,不受Mongoose内置属性的限制。
内容的提问来源于stack exchange,提问作者Ahamad I Milazi
相关产品推荐
相关产品推荐

