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

Jas*_*son 2 typescript typeorm

我有一个使用 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,在我的 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'));
        });
    });
  });
};
Run Code Online (Sandbox Code Playgroud)

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

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

leo*_*ory 5

您可以使用 aSubscriber代替 a ,您可以在订阅者的 TypeORM 文档Listener中找到更多信息。然后您应该将订阅者添加到您的(请参阅此处的配置connectionOptions

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

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)