如何在 NestJs 中捕获 Typeorm 事务错误
How to catch a Typeorm transaction error in NestJs
我有一个用 node.js 和 nestJs 编写的服务器端,用 typeorm 查询。
我正尝试按照建议 with some changes inspired by typeorm's 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 突变中进行的,所以如果出现问题,我应该 return 向客户端发送一个错误,问题是我无法从事务中捕获错误。
尝试这样做:
@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()
它,但它永远不会到达 return 到客户端。
您不是在等待事务完成,因此异常可能会在函数调用结束后抛出,而您不会收到异常。
等待您的交易,应该没问题。
await getManager().transaction(async transactionalEntityManager => {
...
throw 'ERROR THAT SHOULD BE CATCHED'
}
它也是 returns 内部函数的结果,因此很有用。
const ok = await getManager().transaction(async transactionalEntityManager => {
await transactionalEntityManager.save<Entity>(newEntity)
await transactionalEntityManager.save<Entity>(newEntity2)
return 'OK'
}
我有一个用 node.js 和 nestJs 编写的服务器端,用 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 突变中进行的,所以如果出现问题,我应该 return 向客户端发送一个错误,问题是我无法从事务中捕获错误。
尝试这样做:
@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()
它,但它永远不会到达 return 到客户端。
您不是在等待事务完成,因此异常可能会在函数调用结束后抛出,而您不会收到异常。
等待您的交易,应该没问题。
await getManager().transaction(async transactionalEntityManager => {
...
throw 'ERROR THAT SHOULD BE CATCHED'
}
它也是 returns 内部函数的结果,因此很有用。
const ok = await getManager().transaction(async transactionalEntityManager => {
await transactionalEntityManager.save<Entity>(newEntity)
await transactionalEntityManager.save<Entity>(newEntity2)
return 'OK'
}