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