簡體   English   中英

如何在 NestJs 中捕獲 Typeorm 事務錯誤

[英]How to catch a Typeorm transaction error in NestJs

我有一個用 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()它,但它永遠不會返回到客戶端。

您不是在等待事務完成,因此可以在函數調用結束后拋出異常並且您不會收到異常。

等待您的交易,應該沒問題。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM