Nestjs常见问题合集

226 阅读1分钟

循环依赖

现象

出现以下报错时,错误提示表明在 NestJS 项目中检测到了循环依赖。这通常发生在两个或多个类相互引用时,导致 NestJS 无法正确解析依赖关系。

throw new Error(`A circular dependency has been detected (property key: "${key}"). Please, make sure that each side of a bidirectional relationships are using lazy resolvers ("type: () => ClassType").`);

解决办法

  1. 使用懒加载解析器: 确保在定义实体或 DTO 时,使用懒加载解析器。对于循环依赖,您可以将类型定义为一个函数,而不是直接引用类。例如:
   import { Type } from 'class-transformer';

   @Entity()
   export class Department {
       // 修改前:@ManyToOne(() => User)
       @ManyToOne(() => User, (user) => user.departments)
       user: User;
   }
  1. 检查模块导入: 确保在模块中导入的服务和控制器没有形成循环依赖。您可以通过重构代码,将某些功能提取到新的模块中来解决这个问题。
  2. 使用 forwardRef: 如果您确实需要在两个模块之间相互引用,可以使用 forwardRef。例如:
   import { forwardRef, Module } from '@nestjs/common';
   import { UsersModule } from '../users/users.module';
   import { DepartmentsController } from './departments.controller';
   import { DepartmentsService } from './departments.service';

   @Module({
       imports: [forwardRef(() => UsersModule)],
       controllers: [DepartmentsController],
       providers: [DepartmentsService],
       exports: [DepartmentsService],
   })
   export class DepartmentsModule {}