Typescript 在nestjs中导入并注入类型化存储库
这件事快把我逼疯了 我有一个nestjs项目,使用typeorm,具有以下简化结构:Typescript 在nestjs中导入并注入类型化存储库,typescript,nestjs,typeorm,Typescript,Nestjs,Typeorm,这件事快把我逼疯了 我有一个nestjs项目,使用typeorm,具有以下简化结构: + src + dal + entities login.entity.ts password.entity.ts + repositories login.repository.ts password.repository.ts
+ 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 { }
security.module.ts:
@Module({
imports: [TypeOrmModule.forFeature([Entity1, Entity2, Entity3])],
controllers: [],
providers: [PasswordRepository, LoginRepository],
})
export class DalModule { }
@Module({
imports: [TypeOrmModule.forFeature([PasswordRepository, LoginRepository])],
controllers: [SecurityController],
providers: [LoginService, SecurityService],
})
export class SecurityModule { }
@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 {}
app.module.ts:
@Module({
imports: [TypeOrmModule.forFeature([Entity1, Entity2, Entity3])],
controllers: [],
providers: [PasswordRepository, LoginRepository],
})
export class DalModule { }
@Module({
imports: [TypeOrmModule.forFeature([PasswordRepository, LoginRepository])],
controllers: [SecurityController],
providers: [LoginService, SecurityService],
})
export class SecurityModule { }
@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中读取未定义的属性“f1”。如果随后注释掉第一个console.log,则会从第二个console.log获得一个无法读取未定义的属性'f2'
另一方面,如果我在第一个参数中添加@InjectRepository(Password)
,我会得到一个嵌套,它无法解析LoginService(?,LoginRepository)的依赖项。请确保索引[0]处的参数PasswordRepository在SecurityModule上下文中可用
究竟为什么会发生这种情况?我遇到了同样的问题,但我最终解决了
对于您的情况,只需将存储库
类声明为类型或模块
的一部分,然后导出类型或模块
@模块({
导入:[TypeOrmModule.forFeature([PasswordRepository,LoginRepository]),
导出:[TypeOrmModule],
控制器:[SecurityController],
提供者:[登录服务,安全服务],
})
导出类安全模块{}
在其他模块中导入SecuirtyModule
时,LoginRepository
将可用于注入