【问题标题】:TypeORM - Using transactions in Listener methods (BeforeUpdate)TypeORM - 在侦听器方法中使用事务 (BeforeUpdate)
【发布时间】:2020-04-26 14:01:59
【问题描述】:

我有一个使用 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 承诺拒绝,则在 @BeforeUpdate 中执行的插入不存在于同一个事务中,并将保存到数据库中。

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

【问题讨论】:

    标签: typescript typeorm


    【解决方案1】:

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

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

    @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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-02-29
      • 2017-12-10
      • 2013-07-09
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多