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
相关产品推荐
相关产品推荐

