如何在 NestJs 中捕获 Typeorm 事务错误

Posted

技术标签:

【中文标题】如何在 NestJs 中捕获 Typeorm 事务错误【英文标题】:How to catch a Typeorm transaction error in NestJs 【发布时间】:2019-11-25 02:46:27 【问题描述】:

我有一个用 node.js 和 nestJs 编写的服务器端,用 typeorm 查询。

我正在尝试使用here 建议的事务将一些查询包装到数据库中,并在 typeorm 的docs 的启发下进行了一些更改,如下所示:

getManager().transaction(async transactionalEntityManager => 
    transactionalEntityManager.save<Entity>(newEntity)
    transactionalEntityManager.save<Entity1>(newEntity1)
);

事务运行良好,如果出现错误则回滚数据库。 以这种方式测试:

getManager().transaction(async transactionalEntityManager => 
    transactionalEntityManager.save<Entity>(newEntity)
    throw 'There is an error'
    transactionalEntityManager.save<Entity1>(newEntity1)
);

事务的执行在 graphQL Mutation 中,所以如果出现问题我应该向客户端返回一个错误,问题是我无法从事务中捕获错误。

试过这样做:

  @Mutation(returns => Entity)
  async create(): Promise<Entity> 
    let entity = null;
    let error = null;
    getManager().transaction(async transactionalEntityManager => 
      try 
        entity = await transactionalEntityManager.save<Entity>(newEntity)
        await transactionalEntityManager.save<Entity1>(newEntity1);
       catch (err) 
        error = err
      
    )
    if (error) 
      return error
    
    return entity
  

当我抛出错误时,我成功地捕获了它,但是当真正的错误发生时,我可以在服务器中 console.log() 它但它永远不会返回到客户端。

【问题讨论】:

【参考方案1】:

您并没有等待您的事务完成,因此可能会在您的函数调用结束后引发异常并且您没有收到异常。

等待您的交易,应该没问题。

await getManager().transaction(async transactionalEntityManager => 
  ...
  throw 'ERROR THAT SHOULD BE CATCHED'

它还返回内部函数的结果,因此很有用。

const ok = await getManager().transaction(async transactionalEntityManager => 
  await transactionalEntityManager.save<Entity>(newEntity)
  await transactionalEntityManager.save<Entity>(newEntity2)
  return 'OK'

【讨论】:

以上是关于如何在 NestJs 中捕获 Typeorm 事务错误的主要内容,如果未能解决你的问题,请参考以下文章

Nestjs 与自定义存储库中的 Typeorm 事务

如何在 Nestjs 中使用 .env 文件设置 Typeorm 的配置

如何在带有typeorm的nestjs项目中使用外部实体?

如何从控制器 JSON 返回的实体字段中排除。 NestJS + Typeorm

如何创建如何在 typeorm 中创建多对多关系,[NestJS]

如何使用 Jest 在 TypeORM 中存根 EntityManager 和 Connection