noa*_*ner 4 javascript graphql typeorm nestjs
我有一个用node.js和nestJs编写的服务器端,用typeorm进行查询。
我正在尝试按照此处建议的事务将一些查询包装到数据库中,并进行一些受 typeorm文档启发的更改,如下所示:
getManager().transaction(async transactionalEntityManager => {
transactionalEntityManager.save<Entity>(newEntity)
transactionalEntityManager.save<Entity1>(newEntity1)
});
Run Code Online (Sandbox Code Playgroud)
事务运行良好,如果出现错误则回滚数据库。测试这样:
getManager().transaction(async transactionalEntityManager => {
transactionalEntityManager.save<Entity>(newEntity)
throw 'There is an error'
transactionalEntityManager.save<Entity1>(newEntity1)
});
Run Code Online (Sandbox Code Playgroud)
事务的执行在 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
}
Run Code Online (Sandbox Code Playgroud)
当我抛出错误时,我成功捕获它,但是当发生真正的错误时,我可以console.log()在服务器中处理它,但它永远不会返回到客户端。
您不会等待事务完成,因此,可以在函数调用结束后引发异常,并且您不会收到异常。
等待您的交易,应该没问题。
await getManager().transaction(async transactionalEntityManager => {
...
throw 'ERROR THAT SHOULD BE CATCHED'
}
Run Code Online (Sandbox Code Playgroud)
它还返回内部函数的结果,因此它很有用。
const ok = await getManager().transaction(async transactionalEntityManager => {
await transactionalEntityManager.save<Entity>(newEntity)
await transactionalEntityManager.save<Entity>(newEntity2)
return 'OK'
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9580 次 |
| 最近记录: |