Nest.js中Mongoose Schema引用Product模型报错Unit正常如何解决?
问题原因
你遇到的是典型的循环导入+循环依赖问题:
- 实体层面:
Product实体引用了ProductUnit,ProductUnit实体又引用了Product,NodeJS 加载模块时循环导入会返回未初始化完成的模块副本,导致访问ProductUnit.name时拿到的是 undefined - 模块层面:
ProductsModule引入了ProductUnitsModule,ProductUnitsModule又引入了ProductsModule,形成模块循环依赖 - 额外错误:你在
ProductsModule的 providers 里重复注册了ProductUnitsService,该服务已经由ProductUnitsModule导出,不需要重复声明
修复步骤
所有Schema的ref字段改用字符串字面量,避免依赖未初始化的类对象:
ProductUnit里引用Product的ref改为'Product'Product里引用ProductUnit的ref改为'ProductUnit'(就是你报错的那行)
修改后的ProductUnit Schema示例:
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; import { Document, SchemaTypes } from 'mongoose'; import { Product } from 'src/products/entities/product.entity'; import { Unit } from 'src/units/entities/unit.entity'; @Schema() export class ProductUnit extends Document { @Prop({ type: SchemaTypes.ObjectId, ref: Unit.name }) unit: Unit; // 改用字符串字面量作为ref值 @Prop({ type: SchemaTypes.ObjectId, ref: 'Product' }) product: Product; @Prop({ default: false }) defaultBuy: boolean; @Prop({ default: false }) defaultSell: boolean; } export const ProductUnitSchema = SchemaFactory.createForClass(ProductUnit);你报错的Product实体对应行修改为:
@Prop({ type: [{ type: SchemaTypes.ObjectId, ref: 'ProductUnit' }] }) productUnits: ProductUnit[];用Nest提供的
forwardRef处理模块循环依赖
修改ProductUnitsModule:import { Module, forwardRef } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; import { ProductsModule } from 'src/products/products.module'; import { UnitsModule } from 'src/units/units.module'; import { ProductUnit, ProductUnitSchema } from './entities/product-unit.entity'; import { ProductUnitsService } from './product-units.service'; @Module({ imports: [ MongooseModule.forFeature([ { name: ProductUnit.name, schema: ProductUnitSchema, }, ]), UnitsModule, // 用forwardRef包裹循环依赖的模块 forwardRef(() => ProductsModule), ], providers: [ProductUnitsService], exports: [ProductUnitsService], }) export class ProductUnitsModule {}修改
ProductsModule,删除重复的ProductUnitsService声明:import { Module, forwardRef } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; import { TagsModule } from 'src/tags/tags.module'; import { ProductUnitsModule } from 'src/product-units/product-units.module'; import { Product, ProductSchema } from './entities/product.entity'; import { ProductsController } from './products.controller'; import { ProductsService, IsTagValidator, IsCategoryValidator } from './products.service'; @Module({ imports: [ MongooseModule.forFeature([ { name: Product.name, schema: ProductSchema, }, ]), TagsModule, // 用forwardRef包裹循环依赖的模块 forwardRef(() => ProductUnitsModule), ], controllers: [ProductsController], providers: [ ProductsService, IsTagValidator, IsCategoryValidator, // 删掉重复注册的ProductUnitsService ], exports: [ProductsService], }) export class ProductsModule {}
内容的提问来源于stack exchange,提问作者ftmoose
相关产品推荐
相关产品推荐

