NestJs 与 TypeORM(0.3x) 自定义存储库事务问题

问题描述 投票:0回答:1

我通过创建自定义存储库来使用 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 方法之外,如何以与上述相同的方式在事务中使用自定义存储库?

nestjs typeorm node.js-typeorm nestjs-typeorm
1个回答
0
投票

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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.