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

时间:2019-07-16 11:14:33

标签: javascript graphql nestjs typeorm

我有一个用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 个答案:

答案 0 :(得分: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'
}