如何将NestJS中的服务注入到typeorm存储库中?

时间:2020-02-22 00:29:10

标签: typescript nestjs typeorm

我有一个UserRepository,它负责在数据库内部创建/验证用户。我想对用户的密码进行哈希和验证,因此我为此目的创建了一个单独的服务,试图遵循如下的单一责任原则:

@Injectable()
export default class HashService

然后将其导入我的模块中

@Module({
    imports: [TypeOrmModule.forFeature([UserRepository])],
    controllers: [AuthController],
    providers: [AuthService, HashService],
})
export class AuthModule {}

我希望将其注入UserRepository中,我尝试将其作为构造函数参数传递,但由于它的基类已经在其中接受2个参数而无法正常工作,因此我尝试像这样在它们之后注入服务:

@EntityRepository(User)
export default class UserRepository extends Repository<User> {
    constructor(
        entityManager: EntityManager,
        entityMetadata: EntityMetadata,
        @Inject() private readonly hashService: HashService,
    ) {
        super();
    }

    // Logic...
}

但是hashService是未定义的,我也尝试了没有@Inject()装饰器。 将HashService注入我的存储库的最佳方法是什么?我必须创建它的新实例吗?

1 个答案:

答案 0 :(得分:1)

简短的回答:您不会。

TypeORM的自定义存储库,存储库类和实体在技术上不在Nest的DI系统之外,因此无法向其中注入任何值。如果您真的想解决这个问题,可以找出Repository类对其构造函数参数的要求,然后将它们添加到工厂中以实例化存储库类并直接使用它,而不是通过TypeOrmModule.forFeature ,但这是很多额外的工作。

我认为,自定义存储库模式在Nest中没有太大帮助,因为服务本质上具有CustomRepository所具有的逻辑。存储库类是您访问数据库的网关,但是不需要向其添加任何额外的逻辑。