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 votremain.tsou un pluginfp(), 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
OnModuleInitetOnModuleDestroy.
Résumé
| Cas d'usage | Solution Recommandée | Pourquoi ? |
|---|---|---|
| Connexion MongoDB / SQL | Plugin Fastify | Gestion native des connexions, pool, logs. |
| Setup CORS / Helmet | Plugin Fastify | Doit s'appliquer au niveau HTTP brut. |
| Boucle de Jeu (Pong) | Service (onModuleInit) | C'est votre code métier, pas une lib externe. |
| Worker Threads | Service (onModuleInit) | Besoin de contrôler le lancement précis. |
| Nettoyage (Intervals) | Service (onModuleDestroy) | Pour éviter les fuites de mémoire à l'arrêt. |