我通过创建自定义存储库来使用 NestJs,如下所示。
iuser.repository.ts
import { UserEntity } from "../entity/user-entity";
export interface IUserRepository {
findByEmail(email: string): Promise<UserEntity>
}
用户.repository.ts
import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { UserEntity } from "src/user/domain/entity/user-entity";
import { IUserRepository } from "src/user/domain/repository/iuser.repository";
import { Repository } from "typeorm";
@Injectable()
export class UserRepository extends Repository<UserEntity> implements IUserRepository {
constructor(
@InjectRepository(UserEntity)
private readonly userRepository: Repository<UserEntity>
) {
super(UserEntity, userRepository.manager)
}
async findByEmail(email: string): Promise<UserEntity> {
return await this.userRepository
.createQueryBuilder()
.where('email = :email', { email })
.getOne();
}
}
当我运行 withRepository(this.userRepository) 且没有错误指示时,出现以下错误
if (this.isReleased) throw new QueryRunnerAlreadyReleasedError()
^
QueryRunnerAlreadyReleasedError: Query runner already released. Cannot run queries anymore.
这是queryRunner.manager.withRepository(this.userRepository)的日志
UserRepository {
target: [class UserEntity],
manager: undefined,
queryRunner: undefined,
userRepository: Repository {
target: [class UserEntity],
manager: EntityManager {
'@instanceof': Symbol(EntityManager),
repositories: [Map],
treeRepositories: [],
plainObjectToEntityTransformer: PlainObjectToNewEntityTransformer {},
connection: [DataSource]
},
queryRunner: undefined
}
}
我理解 withRepository 创建自定义存储库的实例并传递当前事务的管理器。
我很好奇这个方法,但是不知道如何使用。
除了 TypeORM 文档中的 getRepository().extend 方法之外,如何以与上述相同的方式在事务中使用自定义存储库?
TypeORM 的
.withRepository
使用 Repository
构造函数创建自定义存储库的副本。
所以,你需要要么
我更喜欢第二种方式,它可能会像这样实现
import { Injectable } from "@nestjs/common";
import { InjectEntityManager } from "@nestjs/typeorm";
import { UserEntity } from "src/user/domain/entity/user-entity";
import { IUserRepository } from "src/user/domain/repository/iuser.repository";
import { EntityManager, Repository, QueryRunner } from "typeorm";
@Injectable()
export class UserRepository extends Repository<UserEntity> implements IUserRepository {
constructor(
@Optional() target: unknown,
@InjectEntityManager() manager: EntityManager,
@Optional() queryRunner?: QueryRunner,
) {
super(UserEntity, manager, queryRunner)
}
async findByEmail(email: string): Promise<UserEntity> {
return await this.userRepository
.createQueryBuilder()
.where('email = :email', { email })
.getOne();
}
}