CQRS Module

NestJS 🔴 Senior

Dé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

Appliquer CQRS et des sagas a un CRUD simple, ajoutant de la complexité sans bénéfice réel.
#architecture#interview

En entretien

  1. 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.

  2. 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.

  3. 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.

Fiche mise à jour le 2026-09-27

← → au clavier pour passer d'une fiche à l'autre