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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:24:02