Aller au contenu principal

Cycle de Vie & Hooks

Par défaut, un Service est juste une classe instanciée avec new. Mais dans une application réelle, on a souvent besoin d'exécuter du code après que tout soit chargé (initialisation asynchrone) ou avant que le serveur s'éteigne (nettoyage).

Le framework expose deux interfaces pour gérer ces moments : OnModuleInit et OnModuleDestroy.

Implémentation

Il suffit d'implémenter l'interface dans votre classe de Service. Le framework détectera automatiquement la présence de ces méthodes.

import { Service, OnModuleInit, OnModuleDestroy } from 'my-fastify-decorators';

@Service()
export class CronService implements OnModuleInit, OnModuleDestroy {

private intervalId: NodeJS.Timer | null = null;

// Appelé une fois que le conteneur a fini toutes les injections
async onModuleInit() {
console.log("⏰ Démarrage du Cron Service...");

// Exemple : Tâche de fond toutes les 10 secondes
this.intervalId = setInterval(() => {
console.log("Ping maintenance...");
}, 10000);
}

// Appelé quand le serveur reçoit un signal d'arrêt (Ctrl+C, SIGTERM)
async onModuleDestroy() {
console.log("🛑 Arrêt du Cron Service, nettoyage...");

if (this.intervalId) {
clearInterval(this.intervalId);
}
}
}

Le Grand Débat : Plugin vs Service Hook 🥊

C'est la question la plus importante : Où dois-je mettre ma logique d'initialisation ?

Dans Fastify, on a l'habitude de tout mettre dans des plugins (app.register). Avec ce framework, vous avez maintenant deux endroits possibles. Voici la règle à suivre :

Cas 1 : Infrastructure & Connexions (Utilisez des Plugins 🔌)

Pour tout ce qui est connexion à une Base de Données, Redis, RabbitMQ ou configuration globale de Socket.io.

  • Pourquoi ? L'écosystème Fastify gère parfaitement l'ordre de chargement et l'encapsulation. Si votre DB plante, Fastify le sait et empêche le démarrage.
  • Méthode : Utilisez app.register(fastifyPostgres) dans votre main.ts ou un plugin fp(), puis injectez-le via @InjectPlugin('pg').

Cas 2 : Logique Métier & Processus (Utilisez des Services 🧠)

Pour tout ce qui est spécifique à votre application : Boucles de jeu, Tâches planifiées (Cron), Workers, Calculs de cache au démarrage.

  • Pourquoi ? C'est de la logique métier interne. Ce n'est pas un "outil" externe. De plus, un Service peut avoir besoin d'injecter d'autres Services pour fonctionner (ce qui est dur à faire dans un plugin pur).
  • Méthode : Utilisez OnModuleInit et OnModuleDestroy.

Résumé

Cas d'usageSolution RecommandéePourquoi ?
Connexion MongoDB / SQLPlugin FastifyGestion native des connexions, pool, logs.
Setup CORS / HelmetPlugin FastifyDoit s'appliquer au niveau HTTP brut.
Boucle de Jeu (Pong)Service (onModuleInit)C'est votre code métier, pas une lib externe.
Worker ThreadsService (onModuleInit)Besoin de contrôler le lancement précis.
Nettoyage (Intervals)Service (onModuleDestroy)Pour éviter les fuites de mémoire à l'arrêt.