【问题标题】:NestJS unable to resolve dependencies inside moduleNestJS 无法解析模块内部的依赖关系
【发布时间】:2020-10-23 01:44:30
【问题描述】:

我有两个模块:AuthModuleUserModule

这是UserModule 的样子:

@Module({
    imports: [
        forwardRef(() => AuthModule),
        TypeOrmModule.forFeature([
            UserRepository,
            UserAuthRepository,
            UserSocialRepository,
        ])
    ],
    controllers: [UserController],
    exports: [UserAuthService, UserSocialService, UserService],
    providers: [UserAuthService, UserSocialService, UserService],
})
export class UserModule {}

此模块有 3 个服务:UserAuthServiceUserSocialServiceUserService

内容UserAuthService

@Injectable()
export class UserAuthService {

    /**
     * UserAuthService constructor
     * @param { UserAuthRepository } _userAuthRepository
     * @param { UserRepository } _userRepository
     * @param { UserService } _userService
     * @param { UserSocialService } _userSocialService
     */
    constructor(
        private readonly _userAuthRepository: UserAuthRepository,
        private readonly _userRepository: UserRepository,
        private readonly _userService: UserService,
        private readonly _userSocialService: UserSocialService
    ) {}
}

内容UserSocialService

@Injectable()
export class UserSocialService {

    /**
     * UserSocialService constructor
     * @param { UserSocialRepository } _userSocialRepository
     */
    constructor(
        private readonly _userSocialRepository: UserSocialRepository,
    ) {}
}

内容UserService

@Injectable()
export class UserService {

    /**
     * UserService constructor
     * @param { UserRepository } _userRepository
     * @param { UserAuthService } _userAuthService
     * @param { UserSocialService } _userSocialService
     */
    constructor(
        private readonly _userRepository: UserRepository,
        private readonly _userAuthService: UserAuthService,
        private readonly _userSocialService: UserSocialService
    ) {}
}

AuthModuleUserModule 都有 forwardRef(() => Module) 导入,因为它们都相互依赖。

但是,问题出在UserModule 内部,更具体地说是UserService,由于某种原因它无法解决UserAuthService 依赖项,从而产生以下错误:

Error: Nest can't resolve dependencies of the UserService (UserRepository, ?, UserSocialService). Please make sure that the argument dependency at index [1] is available in the UserModule context.

Potential solutions:
- If dependency is a provider, is it part of the current UserModule?
- If dependency is exported from a separate @Module, is that module imported within UserModule?
  @Module({
    imports: [ /* the Module containing dependency */ ]
  })

这是UserModule的结构:

user/
    controllers/
    dtos/
    exceptions/
    models/
    repositories/
    services/
        - index.ts
        - user.auth.service.ts
        - user.service.ts
        - user.social.service.ts
    subscribers/
    -index.ts

因此,即使所有 3 项服务都在一个模块中,并且它们被导出并标记为提供者,NestJS 也由于某种原因无法解析它们。

【问题讨论】:

    标签: typescript nestjs ioc-container


    【解决方案1】:

    我不是 100% 确定,但我认为您需要使用 @InjectRepository 注入存储库,就像在 example 中所做的那样:

    @Injectable()
    export class UserAuthService {
    
        constructor(
            @InjectRepository(UserAuthRepository)
            private readonly _userAuthRepository: UserAuthRepository,
            @InjectRepository(UserRepository)
            private readonly _userRepository: UserRepository,
            private readonly _userService: UserService,
            private readonly _userSocialService: UserSocialService
        ) {}
    }
    

    【讨论】:

      【解决方案2】:

      您的UserServiceUserAuthService 之间存在循环依赖关系。这两个服务都应该使用@Inject(forwardRef(() => OtherService)) 来确保即使通过循环依赖也可以进行注入。

      一般来说,如果可能的话,你应该尽量避免这些类相互依赖,这是否意味着打破类的范围并让它只访问必要的内容,或者将这些类合并在一起很难说。

      @Injectable()
      export class UserService {
        constructor(
          @InjectRepository(UserRepository)
          private readonly _userRepo: UserRepository,
          @Inject(forwardRef(() => UserAuthService))
          private readonly _userAuthService: UserAuthService,
          private readonly _userSocialService: UserSocialService
        ) {}
      }
      
      @Injectable()
      export class UserAuthService {
        constructor(
          @InjectRepository(UserAuthRepository)
          private readonly _userAuthRepository: UserAuthRepository,
          @InjectRepository(UserRepoitory)
          private readonly _userRepository: UserRepository,
          @Inject(forwardref(() => UserSerivce))
          private readonly _userService: UserService,
          private readonly _userSocialService: UserSocialService
        ) {}
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-19
        • 2018-11-22
        • 2019-12-19
        • 2018-12-25
        • 2022-01-02
        • 2020-11-15
        • 2020-01-14
        • 2021-06-09
        相关资源
        最近更新 更多