Typegoose使用populate报Schema hasn't been registered for model "ref"如何解决
问题原因与解决方案
你遇到的报错是因为Mongoose无法找到已注册的Category模型,对应修改方法如下:
1. 调整模型注册顺序
确保Category模型在Product模型被加载前完成初始化注册,你可以在Product模型文件顶部提前引入Category模型的导出文件:
// product.model.ts 顶部新增一行,先触发Category模型注册 import './category.model'; import { getModelForClass, prop, Ref } from '@typegoose/typegoose'; import { Category } from './category.model';
2. 显式指定模型名称避免自动匹配偏差
Typegoose默认会以类名作为模型名,你可以显式声明模型名和ref引用名,减少匹配错误:
修改Category模型:
import { getModelForClass, prop } from '@typegoose/typegoose'; export class Category { @prop({ required: true }) public name?: string; @prop({ default: null }) public photo?: string; } // 显式指定模型名为Category export default getModelForClass(Category, { options: { customName: 'Category' } });
修改Product模型的ref声明:
// 显式指定ref为已注册的模型名Category @prop({ ref: 'Category', required: true }) public category?: Ref<Category>;
3. 检查模型是否注册到同一连接
如果你使用自定义连接(而非Mongoose默认全局连接),生成模型时需要绑定对应连接:
// 初始化自定义连接 const dbConnection = await mongoose.createConnection(process.env.MONGO_URI).asPromise(); // 生成模型时指定关联连接 export const CategoryModel = getModelForClass(Category, { existingConnection: dbConnection }); export const ProductModel = getModelForClass(Product, { existingConnection: dbConnection });
排查验证
你可以在调用populate方法前打印所有已注册模型名,确认Category已成功注册:
console.log(mongoose.modelNames()); // 输出中需包含Category
内容的提问来源于stack exchange,提问作者Alex Cheung
相关产品推荐
相关产品推荐

