【问题标题】:Nest can't resolve dependencies of the BlahService although it is Global()Nest 无法解析 BlahService 的依赖关系,尽管它是 Global()
【发布时间】:2019-12-24 22:39:15
【问题描述】:

我对 NestJS 有疑问,它似乎只针对 1 个模块,其他所有模块都可以正常工作。我有以下模块。

错误是:

[ExceptionHandler] Nest can't resolve dependencies of the ApplicationService (ApplicationModel, AwsService, UserService, ?, JobService). Please make sure that the argument at index [3] is available in the ApplicationModule context.

AgencyService[3]。如果我从ApplicationModule 中删除AgencyModule,NestJS 将成功编译,我可以进行 API 调用。

AgencyModule,
ApplicationModule,
AuthModule,
JobModule,
UserModule,

所有这些模块都是其他模块为其服务提供者所必需的,因此与其使用forwardRef() 在彼此之间导入它们,我只是将它们设为Global() - 可能不是最佳实践,但嘿嘿(它有效)。

我的AppModule 文件。

@Module({
  imports: [
    MongooseModule.forRootAsync({
      useFactory: (configService: ConfigService) => ({
        uri: configService.get('MONGO_DB_URL'),
        useNewUrlParser: true,
      }),
      imports: [ConfigModule],
      inject: [ConfigService],
    }),
    ConfigModule,
    AgencyModule,
    ApplicationModule,
    AuthModule,
    DevModule,
    JobModule,
    UserModule,
    VideoModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

每个模块文件夹的结构如下。

agency/
- dto/
- agency.controller.ts
- agency.interface.ts
- agency.schema.ts
- agency.service.ts
- agency.module.ts

我的AgencyModule 文件。

@Global()
@Module({
  imports: [
    SharedModule,
    MongooseModule.forFeature([{ name: 'Agency', schema: AgencySchema }]),
  ],
  controllers: [
    AgencyController,
  ],
  providers: [
    AgencyService,
    AwsService,
  ],
  exports: [
    AgencyService,
  ],
})
export class AgencyModule implements NestModule {
  public configure(consumer: MiddlewareConsumer) {
    consumer
      .apply()
      .forRoutes(
        { path: 'agency', method: RequestMethod.GET },
      );
  }
}

我的AgencyService 文件。

@Injectable()
export class AgencyService {
  constructor(
    @InjectModel('Agency') private readonly agencyModel: Model<Agency>,
    private readonly awsService: AwsService,
    private readonly applicationService: ApplicationService,
  ) {
    //
  }

  // More stuff here but not worth adding to the snippet.

}

我的ApplicationModule 文件。

@Global()
@Module({
  imports: [
    SharedModule,
    MongooseModule.forFeature([{ name: 'Application', schema: ApplicationSchema }]),
  ],
  controllers: [
    ApplicationController,
  ],
  providers: [
    ApplicationService,
    AwsService,
  ],
  exports: [
    ApplicationService,
  ],
})
export class ApplicationModule implements NestModule {
  public configure(consumer: MiddlewareConsumer) {
    consumer
      .apply()
      .forRoutes(
        { path: 'application', method: RequestMethod.GET },
      );
  }
}

我的ApplicationService 文件。

@Injectable()
export class ApplicationService {
  constructor(
    @InjectModel('Application') private readonly applicationModel: Model<Application>,
    private readonly awsService: AwsService,
    private readonly userService: UserService,
    private readonly agencyService: AgencyService,
    private readonly jobService: JobService,
  ) {
    //
  }

  // More stuff here but not worth adding to the snippet.

}

AwsService 是一个没有模块的共享服务。

【问题讨论】:

  • 可以添加ApplicationService的构造函数吗?
  • 我会在原帖中添加一个sn-p。
  • AgencyService 是否使用ApplicationService
  • 当您将 ApplicationService 作为依赖项删除时它是否有效?如果是,您可以尝试在两边都使用@Inject(forwardRef(() =&gt; ...Service)),请参阅docs.nestjs.com/fundamentals/circular-dependency
  • 这似乎奏效了!不知道如果模块是全球性的,为什么我必须这样做......你能做出正确的答案吗?如果其他人有问题,我会投赞成票。

标签: javascript node.js typescript dependency-injection nestjs


【解决方案1】:

使用@Global()不会自动解析循环依赖,还是要两边都使用@Inject(forwardRef(() =&gt; MyService)),见docs


正如您自己所说,循环依赖 (forwardRef) 和全局模块 (@Global) 是不好的风格,应该避免。而是使您的依赖关系明确。如果遇到循环依赖提取双方导入的共享服务/模块中的常用部分,请参阅this thread

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 2018-11-21
    • 2020-03-12
    • 2020-07-03
    • 2021-04-28
    • 2020-03-07
    • 2019-12-15
    • 2020-12-14
    • 2020-12-13
    相关资源
    最近更新 更多