You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:52:19