[英]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.