【问题标题】:import and inject a typeorm repository in nestjs在 nestjs 中导入并注入 typeorm 存储库
【发布时间】:2021-07-15 02:28:54
【问题描述】:

这个把我逼疯了!

我有一个使用 typeormnestjs 项目,具有以下简化结构:

+ src
   + dal
        + entities
             login.entity.ts
             password.entity.ts             
        + repositories
             login.repository.ts
             password.repository.ts
        dal.module.ts
   + modules
        + security
             + services
                  login.service.ts
                  security.service.ts
             security.module.ts
   app.module.ts
   main.ts

dal 定义了以下自定义存储库:

@EntityRepository(Login)
export class LoginRepository extends AbstractRepository<Login> implements ILoginRepository { }

@EntityRepository(Password)
export class PasswordRepository extends AbstractRepository<Password> implements IPasswordRepository { }

dal.module.ts:

@Module({
    imports: [TypeOrmModule.forFeature([Entity1, Entity2, Entity3])],
    controllers: [],
    providers: [PasswordRepository, LoginRepository],
})
export class DalModule { }

security.module.ts:

@Module({
    imports: [TypeOrmModule.forFeature([PasswordRepository, LoginRepository])],
    controllers: [SecurityController],
    providers: [LoginService, SecurityService],
})
export class SecurityModule { }

app.module.ts:

@Module({
   imports: [
      DalModule,
      SecurityModule,
      TypeOrmModule.forRoot({
         type: 'mysql',
         port: Number(process.env.DB_PORT),
         host: process.env.DB_SERVER,
         username: process.env.DB_USERNAME,
         password: process.env.DB_PASSWORD,
         database: process.env.DB_NAME,
         entities: [__dirname + '/**/*.entity{.ts,.js}'],
         synchronize: false
      })
   ]
})
export class AppModule {}

login.service.ts:

export class LoginService {
   constructor(
      private readonly passwordRepository: PasswordRepository,
      @InjectRepository(Login) private readonly loginRepository: LoginRepository
   ) {
       console.log(this.passwordRepository.f1);
       console.log(this.loginRepository.f2);
   }

事情是这样的:

现在我将在 LoginService 构造函数中按预期记录 [AsyncFunction: f1][AsyncFunction: f2]

但是,如果我从第二个参数中删除 @InjectRepository(Login),我会从第一个 console.log 中得到一个 Cannot read property 'f1' of undefined。如果我随后注释掉第一个 console.log,我会从第二个 console.log 中得到一个 Cannot read property 'f2' of undefined

另一方面,如果我将@InjectRepository(Password) 添加到第一个参数,我会收到Nest can't resolve dependencies of the LoginService (?, LoginRepository). Please make sure that the argument PasswordRepository at index [0] is available in the SecurityModule context 错误。

到底为什么会这样?

【问题讨论】:

    标签: typescript nestjs typeorm


    【解决方案1】:

    我遇到了同样的问题,但我终于解决了。

    对于您的情况,只需将Repositoryclasses 声明为TypeOrmModule 的一部分,然后导出TypeOrmModule

    @Module({
        imports: [TypeOrmModule.forFeature([PasswordRepository, LoginRepository])],
        exports: [TypeOrmModule],
        controllers: [SecurityController],
        providers: [LoginService, SecurityService],
    })
    export class SecurityModule { }
    

    在其他模块中导入SecuirtyModule时,LoginRepository将可用于注入。

    【讨论】:

      猜你喜欢
      • 2019-07-05
      • 2021-11-21
      • 2020-06-06
      • 2020-04-19
      • 2021-01-07
      • 1970-01-01
      • 2022-09-23
      • 2019-08-17
      • 2022-08-05
      相关资源
      最近更新 更多