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

4

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

我正在尝试像这里建议的那样,将一些对数据库的查询包装在事务中,并受到typeorm 文档的启发,做了一些更改,如下所示:

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个回答

6

如果您没有等待事务完成,异常可能会在函数调用结束后抛出,这样您就无法获得异常。

请等待您的事务完成,这样应该就没问题了。

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'
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接