Synthèse automatique
Référence pour mettre en place des architectures événementielles dans NestJS avec EventEmitter2, ainsi que les modules CQRS (CommandBus, QueryBus, EventBus, sagas).
Points forts
- Couvre deux approches complémentaires (EventEmitter2 pour le pub/sub interne, CQRS pour séparer lectures et écritures) avec des extraits de code prêts à l'emploi
- Explique clairement les pièges pratiques : gestion des handlers asynchrones via async/promisify, wildcards d'événements et enregistrement des handlers dans providers
- Situe honnêtement les limites du in-process et oriente vers les transports microservices, Kafka ou NATS pour les événements inter-services
Limites
- Contenu volontairement condensé : la pattern saga n'est qu'évoquée sans exemple de code
- Ne traite ni la persistance des événements, ni l'idempotence ou les stratégies de retry pour un vrai event sourcing
- Suppose une stack NestJS + Prisma déjà en place et ne détaille pas la configuration des modules
À utiliser lorsque vous concevez ou refactorisez un service NestJS pour découpler les effets de bord ou introduire une séparation commandes/requêtes.
À éviter si vous cherchez un guide complet d'event sourcing avec persistance, rejeu d'événements et garanties de livraison, ou si vous n'utilisez pas NestJS.
Analyse de sécurité
SûrThis is a documentation-only reference skill describing NestJS event-driven patterns (EventEmitter2, CQRS, sagas). It contains no executable actions, no destructive commands, no network exfiltration, and no attempts to disable safety controls. The only shell snippets are standard npm installs of official NestJS packages.
Aucun point d'attention détecté
Comment cette analyse est faiteExemples
Dans mon service NestJS, après la création d'un utilisateur je veux envoyer un email de bienvenue et écrire un log d'audit sans bloquer la requête. Montre-moi comment faire avec @nestjs/event-emitter.Refactorise mon UsersController NestJS pour utiliser CommandBus et QueryBus du module @nestjs/cqrs, avec un CreateUserHandler et un GetUserHandler.Explique-moi quand utiliser EventEmitter2 plutôt que le module CQRS dans NestJS, et donne un exemple de EventBus pour publier un événement de domaine.NestJS Event-Driven Pattern
Build event-driven systems with EventEmitter2, CQRS module, CommandBus, and QueryBus
When to Use
- You need to decouple side effects (send email, update audit log) from the primary operation
- You are implementing CQRS to separate read and write models for a bounded context
- You need event sourcing where domain events are the source of truth
- You want to publish domain events that multiple services can independently handle
Instructions
EventEmitter2 (simple pub/sub within the same process)
- Setup:
npm install @nestjs/event-emitter
@Module({ imports: [EventEmitterModule.forRoot()] })
export class AppModule {}
- Emit events from a service:
@Injectable()
export class UsersService {
constructor(private eventEmitter: EventEmitter2) {}
async create(dto: CreateUserDto): Promise<User> {
const user = await this.prisma.user.create({ data: dto });
this.eventEmitter.emit('user.created', new UserCreatedEvent(user));
return user;
}
}
- Handle events:
@Injectable()
export class EmailNotificationListener {
@OnEvent('user.created')
async handleUserCreated(event: UserCreatedEvent): Promise<void> {
await this.mailService.sendWelcomeEmail(event.user.email);
}
@OnEvent('user.*') // wildcard
async handleAnyUserEvent(event: unknown): Promise<void> { ... }
}
CQRS Module (commands and queries)
npm install @nestjs/cqrs
// command
export class CreateUserCommand { constructor(public dto: CreateUserDto) {} }
// handler
@CommandHandler(CreateUserCommand)
export class CreateUserHandler implements ICommandHandler<CreateUserCommand> {
constructor(private usersRepo: UsersRepository) {}
async execute(command: CreateUserCommand): Promise<User> {
return this.usersRepo.create(command.dto);
}
}
// dispatch from controller
@Post()
create(@Body() dto: CreateUserDto) {
return this.commandBus.execute(new CreateUserCommand(dto));
}
// query
@QueryHandler(GetUserQuery)
export class GetUserHandler implements IQueryHandler<GetUserQuery> {
async execute(query: GetUserQuery): Promise<User> {
return this.usersReadRepo.findById(query.id);
}
}
Register all handlers in providers.
Details
EventEmitter2 vs CQRS: EventEmitter2 is in-process pub/sub — simple, zero setup overhead, good for side effects. CQRS is a structural pattern that separates commands (writes) from queries (reads) — use it when you need independent scaling of read/write paths or when the read model differs significantly from the write model.
EventEmitter2 async handlers: @OnEvent('user.created', { async: true }) ensures async handlers do not block the event loop. Set promisify: true on EventEmitterModule.forRoot() to await async handlers before continuing.
EventBus (CQRS): In addition to CommandBus and QueryBus, the CQRS module provides EventBus for domain events. IEventHandler implementations react to events published via eventBus.publish(new UserCreatedEvent(user)).
Saga pattern: @nestjs/cqrs supports long-running processes via @Saga() decorator — these are RxJS streams that react to events and dispatch commands.
Cross-service events: EventEmitter2 is in-process only. For cross-service messaging (microservices), use the NestJS microservices transport layer (@EventPattern, Redis/RabbitMQ) or integrate with Kafka/NATS for durable event streams.
Source
https://docs.nestjs.com/recipes/cqrs
Process
- Read the instructions and examples in this document.
- Apply the patterns to your implementation, adapting to your specific context.
- Verify your implementation against the details and edge cases listed above.
Harness Integration
- Type: knowledge — this skill is a reference document, not a procedural workflow.
- No tools or state — consumed as context by other skills and agents.
Success Criteria
- The patterns described in this document are applied correctly in the implementation.
- Edge cases and anti-patterns listed in this document are avoided.
Du fichier au premier essai
Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.
Consulter la source et ses fichiers annexesCe téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.
1. Télécharger le fichier
Télécharger SKILL.mdDepuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/nestjs-event-driven-pattern-ms2s7cy8/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.
Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.
mkdir -p '.skill-downloads/nestjs-event-driven-pattern-ms2s7cy8' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/nestjs-event-driven-pattern-ms2s7cy8/download' --output '.skill-downloads/nestjs-event-driven-pattern-ms2s7cy8/SKILL.md.part' && mv '.skill-downloads/nestjs-event-driven-pattern-ms2s7cy8/SKILL.md.part' '.skill-downloads/nestjs-event-driven-pattern-ms2s7cy8/SKILL.md'2. Vérifier les prérequis
Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.
Aucune section de prérequis reconnue dans ce fichier. Cela ne signifie pas qu’il est autonome : les bibliothèques, outils et accès peuvent être cités ailleurs dans le contenu ou dans le dépôt source.
Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.
3. Charger la skill
Le fichier ne fournit pas un en-tête name/description exploitable pour cette procédure native. Le téléchargement reste disponible pour lecture ; utilisez le mode manuel ci-dessous.
Mode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.
4. Faire un premier essai
Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :
Lis .skill-downloads/nestjs-event-driven-pattern-ms2s7cy8/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.
Bonnes pratiques React Hook Form
Developpement
Maîtrisez React Hook Form : évitez les anti-patterns, gérez les abonnements, et traitez correctement reset, dirty state et entrées contrôlées.
Migration Emotion vers Mantine
Developpement
Migrer les styled-components Emotion vers des composants Mantine avec style props et modules CSS. Pour convertir .styled.tsx ou supprimer les imports @emotion.
Détecteur de dérive de périmètre
Developpement
Analyse les diffs git par rapport à une intention pour détecter la dérive de périmètre, fichiers non liés et PR trop larges, puis suggère de garder, diviser ou justifier.