NodeJS NestJS类型:对多个存储库运行插入操作

cnjp1d6j  于 2023-02-03  发布在  Node.js
关注(0)|答案(1)|浏览(226)

我有几个API运行CRUD操作,例如:

POST /table
POST /chair

并且在各自的服务文件中都有自己的存储库示例。以下是Table的服务文件的示例代码-
table.service.ts

// import statements

export class TableService {
  private readonly tableRepository: Repository<TableEntity>;
    constructor(
      @Inject('CONNECTION') private connection: DataSource,
    ) {
      this.tableRepository = connection.getRepository(TableEntity);
    }

  async create(createTableDto: CreateTable) {
    const result = await this.tableRepository.insert({...createTableDto});
    return this.tableRepository.findOneOrFail({where: {id: result.identifiers[0].id}});
  }
}

椅子的服务文件具有类似的实现。
我有另一个API,我们称之为/test,它将通过从createChairEntity的服务文件调用create方法来执行插入操作-
test.service.ts

export class TestService {
  constructor(
    private readonly tableService: TableService,
    private readonly chairService: ChairService,
    @Inject('CONNECTION') private connection: DataSource,
  ) {}

  async create() {
   const tableData = ...;
   const chairData = ...;
   tableService.create(tableData);
   chairService.create(chairData); 
  }

如何在事务中运行上述操作?我不能使用DataSource.transaction,因为所有数据库操作都必须使用提供的实体管理器执行,但我不这样做。
我可以利用connection对象吗?或者我们有其他方法吗?

y53ybaqx

y53ybaqx1#

如果您使用的是最新版本的nestjs 9和typeOrm 0.3.11,下面是我实现这一点的方法:

import { HttpException, Injectable } from '@nestjs/common';
import { InjectRepository, InjectDataSource } from '@nestjs/typeorm';
import { Like, Repository, DataSource, EntityManager  } from 'typeorm';
import { Users } from './entities/users.entity';
import { UsersRoles } from './entities/users_roles.entity';

@Injectable()
export class AppService {
    constructor(
        @InjectRepository(Users)
        private usersRepository: Repository<Users>,
        @InjectRepository(UsersRoles)
        private usersRolesRepository: Repository<UsersRoles>,
        @InjectDataSource()
        private dataSource: DataSource,
) {}

async createUser(data: any, submit_user: any): Promise<any> {
    try {
        const result = await this.dataSource.manager.transaction(async (entityManager: EntityManager) => {
            const user = new Users();
            user.name = data.name;
            user.email = data.email;
            user.created_at = new Date();
            user.updated_at = new Date();
            await entityManager.save(user);

            const userRole = new UsersRoles();
            userRole.users_id = user.id;
            userRole.roles_id = data.role_id;
            userRole.supervisor_id = data.supervisor_id || null;
            userRole.submitted_by = submit_user.id;
            userRole.created_at = new Date();
            userRole.updated_at = new Date();
            await entityManager.save(userRole);
        });
        console.log(result);
        return result;
    } catch (error) {
        throw new HttpException(error, 500);
    }
   }
}

为了从本质上解释它,您将从TypeORM注入数据源,并将其与事务管理器一起使用,您将创建一个回调函数,其中包含您将在其中使用的entityManager参数。
示例化用例User和User角色中的两个实体,添加要保存的数据,然后使用entityManager参数执行保存。
由于您使用的是事务管理器,因此它应该在失败时为您处理回滚,但需要进行测试以100%验证这一点。

相关问题