A progressive Node.js framework for building efficient and scalable server-side applications.
NestJS Microservices CQRS - Modified CQRS module to subscribe/publish Events globally instead of locally
Overriding @nestjs/cqrs
module, its EventBus
is changed in order to subscribe to events globally
when registering Handlers
.
Publishing Events
will emit them instead of executing their corresponding handlers.
By default, any Event
to which at least one Handler
is registered, will be subscribed Globally
.
Also, publish
method of this module's EventBus
will publish the Event
globally, and not locally.
Therefore, the Handler
will be executed after we received the Event
from the network.
$ npm install --save @melkonline/nestjs-microservices-cqrs
import { NestjsMicroservicesCqrs } from "@melkonline/nestjs-microservices-cqrs";
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.connectMicroservice(app.get(NestjsMicroservicesCqrs).init(microserviceConfig), {
inheritAppConfig: true,
});
await app.startAllMicroservices();
app.get(NestjsMicroservicesCqrs).run();
app.listen(3456);
}
bootstrap();
import { NestjsMicroservicesCqrsModule } from '@melkonline/nestjs-microservices-cqrs';
@Module({
imports: [
/** All other modules */
NestjsMicroservicesCqrsModule
],
controllers: [/* ...Controllers */],
providers: [
/**
...Services
...CommandHandlers
...EventHandlers
*/
],
})
export class AppModule {}
import { SerializableEvent, ISerializableEvent } from '@melkonline/nestjs-microservices-cqrs';
export class TaskCreatedEvent extends SerializableEvent implements ISerializableEvent {
constructor(public readonly createTaskDto: CreateTaskDto) {
super();
}
}
import { EventBus } from '@melkonline/nestjs-microservices-cqrs';
@Controller()
export class AppController {
constructor(
private readonly appService: AppService,
private readonly eventBus: EventBus,
) {}
@Get('test')
test() {
const data = new CreateTaskDto();
data.type = 'testing the module';
return this.eventBus.publish(new TaskCreatedEvent(data));
}
}
Simply add @LocalEvent()
decorator to your Event
class.
import { LocalEvent } from '@melkonline/nestjs-microservices-cqrs';
@LocalEvent()
export class TaskCreatedEvent implements IEvent {
constructor(public readonly data: CreateTaskDto) {}
}
Such events will be neither subscribed, nor published globally, instead they will work locally as traditional.
Beside subscribing to the Event
via Handler
, you still can subscribe as a route via @EventPattern()
decorator as traditional:
@Controller()
export class AppController {
constructor(
private readonly appService: AppService,
private readonly eventBus: EventBus,
) {}
@EventPattern('TaskCreatedEvent')
someOtherWayToHandleOurEvent(@Payload() message) {
console.log('someOtherWayToHandleOurEvent', message);
}
}
NestJS Microservices CQRS is MIT licensed.