Node.js est conçu autour d'un modèle d'entrées/sorties non bloquant et orienté événements. Cela signifie que les opérations comme la lecture de fichiers, les requêtes réseau, ou les interactions avec une base de données sont exécutées de manière asynchrone et signalent leur achèvement ou échec via des événements. Le système d'événements de Node.js est central pour ce modèle de fonctionnement.

EventEmitter

Au cœur du système d'événements de Node.js se trouve la classe EventEmitter du module events. Les instances de EventEmitter émettent des événements nommés qui causent l'exécution de fonctions appelées "listeners" ou "handlers" attachées à ces événements.

Voici comment vous pouvez utiliser EventEmitter :

const EventEmitter = require('events');

// Créer une instance de EventEmitter
const myEmitter = new EventEmitter();

// Définir un listener pour l'événement 'event'
myEmitter.on('event', () => {
  console.log('Un événement a été émis!');
});

// Émettre l'événement 'event'
myEmitter.emit('event');

Patterns d'Événements

Les objets EventEmitter peuvent gérer plusieurs listeners pour le même événement. Les listeners peuvent être ajoutés avec on() pour une réponse à chaque émission de l'événement, ou avec once() pour une réponse unique.

// Répondre à chaque fois
myEmitter.on('event', () => {
  console.log('Répondre à chaque fois');
});

// Répondre une seule fois
myEmitter.once('event', () => {
  console.log('Répondre une seule fois');
});

 

Gestion des Erreurs

Les EventEmitter ont un événement spécial error qui est utilisé pour signaler des erreurs. Si un événement error est émis et qu'aucun listener n'est attaché, Node.js va arrêter le processus et imprimer la trace de la pile.

myEmitter.on('error', (err) => {
  console.error('Une erreur est survenue:', err);
});

myEmitter.emit('error', new Error('quelque chose a mal tourné'));

 

Asynchronicité

Les listeners d'événements sont appelés de manière synchrone par défaut. Cependant, il est possible de les rendre asynchrones avec des processus comme setImmediate() ou process.nextTick(), ou en utilisant des fonctions asynchrones.

myEmitter.on('event', async () => {
  await someAsyncOperation();
  console.log('Opération asynchrone terminée');
});

 

Bonnes Pratiques

  • Gestion des listeners : Assurez-vous de gérer correctement l'ajout et la suppression de listeners pour éviter les fuites de mémoire.
  • Nommer les événements : Utilisez des noms d'événements descriptifs et cohérents.
  • Modularité : Créez des modules qui héritent de EventEmitter pour gérer des domaines fonctionnels spécifiques de votre application.
  • Gestion des erreurs : Attachez toujours un listener pour l'événement error pour éviter des comportements inattendus et des crashs de l'application.

Le système d'événements est un pilier de Node.js et permet de construire des applications hautement scalables et réactives. Bien comprendre et utiliser EventEmitter est essentiel pour maîtriser le développement Node.js.

Modifié le: jeudi 2 novembre 2023, 08:38