我正在使用 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);
}
}
您不能在订阅构造函数中使用
@Inject(REQUEST) private readonly request
,因为订阅者不能处于请求范围内。ormconfig.json
文件来绑定您的订阅者。
将订阅者添加到模块提供商:
@Module({
imports: [TypeOrmModule.forFeature([User])],
providers: [UsersService, TransactionsSubscriber],
controllers: [UsersController],
})
export class UsersModule {}
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 不能是请求范围的,但我仍然设法让它在我正在开发的多租户应用程序中工作:每个客户都有自己的专用数据库,并且连接是根据经过身份验证的创建的请求。
我必须做的是:
UserSubscriber
的构造函数(因为dataSource未定义)UserSubscriber
添加到数据源选项 subscribers