NestJS+TypeORM - 从订阅者访问存储库(尝试模仿触发器)

问题描述 投票:0回答:2

我正在使用 NestJS 进行第一个项目,我有点困惑。

我有 2 个实体:

Account
Transaction

我应该如何实现一种方法来更新

Account.balance
中的更改(创建、更新、删除)
Transactions

看起来我应该创建一个

TransactionsSubscriber
,但我似乎无法访问数据库连接。

订阅者已加载到

ormconfig.json

我觉得我错过了一些明显的东西,但我已经被困在那里太久了。请有人帮助我。

@EventSubscriber()
export class TransactionsSubscriber
  implements EntitySubscriberInterface<TransactionEntity> {
  constructor(
    @InjectConnection('Account') readonly connection: Connection,
    @InjectRepository(TransactionEntity) transactionsRepo: Repository<TransactionEntity>,
    // @InjectEventEmitter() private emitter: AppEventEmitter,
    @Inject(REQUEST) private readonly request,
  ) {
    // connection.subscribers.push(this);
    console.log(
      typeof connection, // <=== ** here it returns me undefined **
      typeof transactionsRepo // and here too
      //, typeof emitter
    );
  }

  /**
   * Indicates that this subscriber only listen to TransactionEntity events.
   */
  listenTo() {
    return TransactionEntity;
  }

  afterInsert(event: InsertEvent<TransactionEntity>) {
    console.log(`After Transaction INSERTED: `, event.entity);
  }
}
nestjs typeorm
2个回答
2
投票

您不能在订阅构造函数中使用

@Inject(REQUEST) private readonly request
,因为订阅者不能处于请求范围内
您不应该使用
ormconfig.json
文件来绑定您的订阅者。 将订阅者添加到模块提供商:

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UsersService, TransactionsSubscriber],
  controllers: [UsersController],
})
export class UsersModule {}

0
投票

FWIW,nestjs 现在有一个订阅者部分:https://docs.nestjs.com/techniques/database#subscribers

import {
  DataSource,
  EntitySubscriberInterface,
  EventSubscriber,
  InsertEvent,
} from 'typeorm';
import { User } from './user.entity';

@EventSubscriber()
export class UserSubscriber implements EntitySubscriberInterface<User> {
  constructor(dataSource: DataSource) {
    dataSource.subscribers.push(this);
  }

  listenTo() {
    return User;
  }

  beforeInsert(event: InsertEvent<User>) {
    console.log(`BEFORE USER INSERTED: `, event.entity);
  }
}

然后,将 UserSubscriber 类添加到providers数组中:

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UsersService, UserSubscriber],
  controllers: [UsersController],
})
export class UsersModule {}

有一个注释,EventSubscribers 不能是请求范围的,但我仍然设法让它在我正在开发的多租户应用程序中工作:每个客户都有自己的专用数据库,并且连接是根据经过身份验证的创建的请求。

我必须做的是:

  1. 删除
    UserSubscriber
    的构造函数(因为dataSource未定义)
  2. UserSubscriber
    添加到数据源选项
    subscribers
© www.soinside.com 2019 - 2024. All rights reserved.