typescript - Registrera manuellt en typeorm EventSubscriber i NestJS utan att specificera det i konfigurationsfilen
I NestJS utökade jag klassen EntitySubscriberInterface för att skapa en generisk EventSubscriber.
Mitt mål är att fånga alla typeorm-repositoryhändelser 'beforeInsert' varje gång jag infogar något i databasen (det bör utlösas för alla entiteter).
Den här koden fungerar eftersom filen är sparad i en av mapparna inne i src-mappen i NestJS och sökvägen till den anges i NestJS-konfigurationsfilen; på så sätt laddas subscriber-filen automatiskt.
Mitt mål skulle vara att flytta denna fil till ett npm-paket så att jag kunde extrahera den från huvudlogiken i NestJS-appen och sedan initiera den vid behov genom att göra något som 'new ValidatorSubscriber()';
Är det möjligt? Eftersom alla mina försök hittills har misslyckats.
Jag försökte i app.module.ts att initiera min ValidatorSubscriber-klass och konstruktorn kallas korrekt men sedan fungerar inte subcribers.
Någon idé?
import { EntitySubscriberInterface, EventSubscriber, InsertEvent } from 'typeorm';
@EventSubscriber()
export class ValidatorSubscriber<T> implements EntitySubscriberInterface<T> {
private entitiesMap = new Map();
constructor() {
console.log('EventSubscriber constructor')
import('../db/entities') // get all entities
.then((allEntities: any) => {
for (const prop in allEntities) {
this.entitiesMap.set(prop, allEntities[prop])
}
console.log(allEntities)
});
}
/**
* Called before post insertion.
*/
async beforeInsert(event: InsertEvent<any>): Promise<void> {
console.log(`BEFORE INSERTION, ${JSON.stringify(event.entity)}`)
}
}
Svar #1
Om någon behöver det, lyckades jag hitta en lösning.
Jag kombinerade svaret från detta Stack Overflow-inlägg med svaret som ges här av fwoelffel (se skärmdump av svaret).
Tänk på att InjectConnection är föråldrat, jag använde detta istället:
constructor(
@Inject(Connection) readonly connection: Connection,
) {
Svar #2
Min lösning var att sätta EventSubscriber inuti providers, och utelämna subscribers i dataSource-alternativen.
@Module({
imports: [CustomerModule, TypeOrmModule.forFeature([Cart, Customer, Product])],
controllers: [CartController],
providers: [CartService, CustomerCartSubscriber],
exports: [CartService]
})
Internals av CustomerCartSubscriber (fokus på att använda @Inject inuti konstruktorn):
@EventSubscriber()
export class CustomerCartSubscriber implements EntitySubscriberInterface<Customer> {
constructor(
@Inject(CartService) public readonly cartService: CartService,
@Inject(DataSource) dataSource: DataSource
) {
dataSource.subscribers.push(this);
}
listenTo() {
return Customer;
}
async beforeInsert(event: InsertEvent<Customer>) {
await this.cartService.createCart(event.entity);
}
}
Som jag har konstaterat, även om jag lägger till prenumerant i leverantörer, men också aktiverar globala prenumeranter, så utelämnas mina injicerade tjänster? (undefined, trots att de finns i konstruktorn)
