gpt4 book ai didi

typescript - TypeORM - 在监听器方法中使用事务(BeforeUpdate)

转载 作者:行者123 更新时间:2023-12-03 08:46:03 28 4
gpt4 key购买 nike

我有一个使用 TypeORM 的 NodeJS 后端服务器,每次更新实体时我都需要执行插入。所以我的 BaseModel 类中有以下代码:

abstract class BaseModel {
// ...
@BeforeUpdate()
private async InsertBeforeUpdate() {
let entToSave: BaseModel;
// Create the entity that I want to insert
await getManager().save(entToSave);
}
}

然后,在我的 DAL 中:

const saveUser = (user: User) => {
return new Promise((resolve, reject) => {
getManager().transaction(async manager => {
manager
.save(user)
.then(() => {
resolve('yay');
})
.catch(() => {
reject(new Error('boo'));
});
});
});
};

但是,这会带来一个问题。如果保存操作失败并且 saveUser Promise 被拒绝,则 @BeforeUpdate 中执行的插入在同一事务上不存在,并且将保存到数据库。

如何在 @BeforeUpdate 监听器函数中访问所述事务管理器?

最佳答案

您可以使用订阅者代替监听器,您可以在 TypeORM documentation on subscribers 上找到更多信息。然后您应该将订阅者添加到您的 connectionOptions (请参阅 config here )

例如,要将当前的钩子(Hook)转换为订阅者,可以按如下方式声明它:

@EventSubscriber()
export class UserSubscriber implements EntitySubscriberInterface<User> {

listenTo() {
return User;
}

async beforeUpdate(event: UpdateEvent<Person>) {
const entToSave = new WhateverEntity();
// This will give you access to original manager, and so same transaction
await event.manager
.save(entToSave);
}
}

关于typescript - TypeORM - 在监听器方法中使用事务(BeforeUpdate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61442055/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com