Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用NestJs和TypeORM处理事务的正确方法是什么?_Javascript_Node.js_Transactions_Nestjs_Typeorm - Fatal编程技术网

Javascript 使用NestJs和TypeORM处理事务的正确方法是什么?

Javascript 使用NestJs和TypeORM处理事务的正确方法是什么?,javascript,node.js,transactions,nestjs,typeorm,Javascript,Node.js,Transactions,Nestjs,Typeorm,我正在将NestJS与TypeORM一起使用。我有几个模块,每个模块都包含服务。有些模块导入其他模块并使用其服务 // In Person Module @Injectable() class UserService { constructor( @InjectRepository(User) private usersRepository: Repository<User> ) {} public async deleteUsersByCompany(

我正在将NestJS与TypeORM一起使用。我有几个模块,每个模块都包含服务。有些模块导入其他模块并使用其服务

// In Person Module
@Injectable()
class UserService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>
  ) {}

  public async deleteUsersByCompany(companyId: string) {
    const usersToDelete = await this.usersRepository
      .createQueryBuilder('user')
      .where('user.companyId = :companyId', { companyId })
      .getMany();

    if (usersToDelete.length > 0) {
      await this.usersRepository.delete(
        usersToDelete.map((user) => user.id),
      );
    }
  }

  ...
}

// Company Module

@Injectable()
class CompanyService {
  constructor(
    @InjectRepository(Company)
    private companysRepository: Repository<Company>,
    private usersService: UserService
  ) {}

  public async deleteCompany(companyId: string) {
    const companyToDelete = await this.companysRepository.find(companyId);

    if (companyToDelete) {
      await usersService.deleteUsersByCompany(companyToDelete.id)
      await this.companysRepository.delete(companyToDelete);
    }
  }

  ...
}
//面对面模块
@可注射()
类用户服务{
建造师(
@注入存储库(用户)
私有用户存储库:存储库
) {}
公共异步deleteUsersByCompany(companyId:string){
const usersToDelete=wait this.usersRepository
.createQueryBuilder(“用户”)
.where('user.companyId=:companyId',{companyId})
.getMany();
如果(usersToDelete.length>0){
等待this.usersRepository.delete(
usersToDelete.map((user)=>user.id),
);
}
}
...
}
//公司模块
@可注射()
类公司服务{
建造师(
@(公司)
私有公司存储库:存储库,
私有用户服务:用户服务
) {}
公共异步deleteCompany(companyId:string){
const companyToDelete=wait this.companysRepository.find(companyId);
如果(公司删除){
等待usersService.deleteUsersByCompany(companyToDelete.id)
等待此.companysRepository.delete(companyToDelete);
}
}
...
}
在本例中:

  • 我希望
    usersService.deleteUsersByCompany
    成为原子操作
  • 我希望
    companyService.deleteCompany
    成为原子操作
  • 用户可以触发
    usersService.deleteUsersByCompany
    companyService.deleteCompany
  • 我想在事务中包装这两个操作。我读过,但找不到正确的答案。
    这里的主要问题是,
    companyService.deleteUsersByCompany
    正在调用
    usersService.deleteCompany

  • 如何支持这种“嵌套事务”
  • QueryRunner是否替换存储库模式
  • 我的服务应该同时包含存储库和连接实例吗?非事务性操作的存储库和获取QueryRunner的连接

  • 您需要这些方法在事务上下文之外也是可执行的?是的。这些方法可以在任何地方使用。我有知识,但没有时间,明天我会试着写一个答案。同时-您需要向方法传递一个可选参数:
    entityManager
    您可以从您选择的事务方法(所有类型的api,包括装饰程序)获取它
    deleteUsersByCompany(companyId:string,entityManager:entityManager=this.usersRepository.manager)
    方法内部:
    entityManager.getRepository(User).createQueryBuilder('User')…
    应该是这样的,我会想到一个更漂亮的实现。我已经知道了。问题是重构所有服务以获得另一个entityManager参数在我看来并不好。它只是处理数据库的任何方法。此外,在每个方法中,我都必须检查事务是已启动还是应启动新的事务。对于一个样板来说,用任何方法都是很难的。正在尝试钩住
    类型化事务性cls
    ,这听起来很有希望,但效果不好(),并导致其他问题。我仍然在寻找一个合适的解决方案。我想我给了你一个合适且有效的解决方案。如果您正在寻找抽象,我会阅读自定义存储库的文档。无论哪种方式,您都需要使用包或自己实现该逻辑。