TypeORM - Использование транзакций в методах прослушивателя (BeforeUpdate) - PullRequest
1 голос
/ 26 апреля 2020

У меня есть NodeJS внутренний сервер, использующий TypeORM, и мне нужно выполнять вставку каждый раз, когда сущность обновляется. Итак, у меня есть следующий код в моем 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 функция слушателя?

1 Ответ

1 голос
/ 26 апреля 2020

Вы можете использовать Subscriber вместо Listener, вы можете найти дополнительную информацию в документации TypeORM для подписчиков . Затем вам нужно добавить подписчика в ваш connectionOptions (см. config здесь )

Например, чтобы превратить ваш текущий хук в подписчика, вы можете объявить его следующим образом:

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