CQRS Module
NestJS 🔴 SeniorDéfinition
Module @nestjs/cqrs qui sépare les écritures (CommandBus + @CommandHandler) des lectures (QueryBus + @QueryHandler) et notifie les changements d'état via EventBus + @EventsHandler. Les Sagas écoûtent les evenements via RxJS pour déclencher de nouvelles commandes dans des workflows complexes.
Analogie
Comme séparer le guichet des dépôts (commands) de celui des renseignements (queries) dans une banque, avec un tableau d'affichage (events) pour prévenir les autres services.
Exemple de code
@CommandHandler(CreateOrderCommand)
export class CreateOrderHandler
implements ICommandHandler<CreateOrderCommand> {
constructor(private eventBus: EventBus, private repo: OrderRepo) {}
async execute(cmd: CreateOrderCommand) {
const order = await this.repo.create(cmd.dto);
this.eventBus.publish(new OrderCreatedEvent(order.id));
return order;
}
}
Cas d'usage
Découpler la logique d'écriture, de lecture et de notification dans un domaine métier complexe (e-commerce, facturation).
Anti-pattern
Termes liés
En entretien
Explique-moi le principe du module CQRS dans NestJS.
Il sépare les écritures via CommandBus/@CommandHandler des lectures via QueryBus/@QueryHandler, et notifie les changements d'état via EventBus/@EventsHandler, avec des Sagas qui écoutent ces événements en RxJS pour déclencher de nouvelles commandes. C'est comme séparer le guichet des dépôts de celui des renseignements dans une banque, avec un tableau d'affichage pour prévenir les autres services.
Quand est-ce que tu éviterais d'utiliser CQRS avec des sagas ?
Sur un CRUD simple, ça ajoute de la complexité sans bénéfice réel. Je réserve ça à un domaine métier complexe comme l'e-commerce ou la facturation, où découpler écriture, lecture et notification a du sens.
Comment ça s'articule concrètement dans le code, par exemple pour créer une commande ?
Un CommandHandler reçoit la commande, exécute la logique métier via le repository, puis publie un event sur l'eventBus pour notifier les autres parties du système.
Sources
Fiche mise à jour le 2026-09-27