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

NestJS v9依赖注入失败求助:已导入仍无法解析依赖

NestJS v9升级后依赖无法解析问题

升级至NestJS v9后出现依赖无法解析问题,该代码在NestJS v7中可正常运行(当时无需导入RepositoriesModule)。

相关代码

RepositoriesModule代码

@Module({
  imports: [TypeOrmConfigModule, TypeOrmModule.forFeature([Project, User])],
  providers: [DatabaseProjectRepository, DatabaseUserRepository],
  exports: [DatabaseProjectRepository, DatabaseUserRepository], // 已显式导出DatabaseProjectRepository
})
export class RepositoriesModule {}

ProjectUsecasesModule动态模块代码

@Module({
  imports: [LoggerModule, EnvironmentConfigModule, RepositoriesModule, ExceptionsModule],
})
export class ProjectUsecasesModule {
  static GET_PROJECT_USECASE = 'getProjectUsecases';

  static register(): DynamicModule {
    return {
      module: ProjectUsecasesModule,
      imports: [RepositoriesModule], // 已导入包含DatabaseProjectRepository的模块
      providers: [
        {
          inject: [DatabaseProjectRepository], 
          provide: ProjectUsecasesModule.GET_PROJECT_USECASE,
          useFactory: (ProjectRepository: DatabaseProjectRepository) => new GetProjectUseCases(ProjectRepository), // Nest提示找不到DatabaseProjectRepository
        },

运行时错误

Nest can't resolve dependencies of the getProjectUsecases (?). Please make sure that the argument DatabaseProjectRepository at index [0] is available in the ProjectUsecasesModule context.

问题原因

NestJS v9收紧了动态模块的依赖解析规则,核心问题出在动态模块的独立上下文特性上:

  • 你在ProjectUsecasesModule的根装饰器里导入了RepositoriesModule,但动态模块的register()方法返回的是一套独立的模块配置,不会自动继承根模块的依赖项。
  • 虽然你在register()里也手动导入了RepositoriesModule,但要注意:如果DatabaseProjectRepository是自定义类,NestJS v9对注入令牌的匹配要求更严格——如果存在重复导入(比如从不同路径导入同一个类),会被识别为不同的注入令牌,导致依赖查找失败。
  • 另外,若该Repository是TypeOrm的自定义实现,需确认它正确使用了@InjectRepository(Project)装饰器,且TypeOrmModule.forFeature中已注册对应的Project实体,否则即使导出了模块,Nest也无法正确解析依赖。

内容的提问来源于stack exchange,提问作者Brann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:45:52