@melkonline/nestjs-microservices-cqrs
v1.0.5
Published
NestJS Microservices CQRS - Modified CQRS module to subscribe/publish Events globally instead of locally
Downloads
21
Readme
nestjs-microservices-cqrs
Description
NestJS Microservices CQRS
NestJS Microservices CQRS - Modified CQRS module to subscribe/publish Events globally instead of locally
How It Works?
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.
Installation
$ npm install --save @melkonline/nestjs-microservices-cqrs
Quick Start
In your main.ts:
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();
In your app.module.ts:
import { NestjsMicroservicesCqrsModule } from '@melkonline/nestjs-microservices-cqrs';
@Module({
imports: [
/** All other modules */
NestjsMicroservicesCqrsModule
],
controllers: [/* ...Controllers */],
providers: [
/**
...Services
...CommandHandlers
...EventHandlers
*/
],
})
export class AppModule {}
In your Event
:
import { SerializableEvent, ISerializableEvent } from '@melkonline/nestjs-microservices-cqrs';
export class TaskCreatedEvent extends SerializableEvent implements ISerializableEvent {
constructor(public readonly createTaskDto: CreateTaskDto) {
super();
}
}
Using EventBus
:
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));
}
}
Still Want local
Events?
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.
Microservice Route Is Also Available:
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);
}
}
License
NestJS Microservices CQRS is MIT licensed.