Aller au contenu principal

Accéder aux Plugins Fastify

Fastify brille par son écosystème de plugins (fastify-postgres, fastify-redis, fastify-socket.io, plugin-maison, etc.). Ces plugins "décorent" l'instance principale de Fastify pour rendre des fonctionnalités disponibles partout.

Dans my-fastify-decorators, il existe deux façons d'accéder à ces plugins, selon l'endroit où tu te trouves.

1. La Voie Royale : @InjectPlugin (Pour les Services) 👑

C'est la méthode recommandée. La logique métier se trouvant dans les Services, c'est eux qui ont besoin d'accéder à la base de données ou aux sockets.

Grâce à l'Injection de Dépendances, le framework connecte ton Service directement à l'instance Fastify.

Comment ça marche ?

Le décorateur @InjectPlugin('nom_du_decorateur') va chercher la propriété correspondante sur l'instance globale de Fastify (app).

  • Avantage : Ton service reste propre, testable et découplé de la couche HTTP.
  • Usage : Accès BDD, IO, Redis, Mailer, RabbitMQ, etc.
import { Service, InjectPlugin } from 'my-fastify-decorators';
import { FastifyInstance } from 'fastify';
// Importe les types de tes libs externes
import { Database } from 'better-sqlite3';

@Service()
export class UserService {

// Va chercher app.db (injecté par ton plugin BDD)
@InjectPlugin('db')
private db!: Database;

// Va chercher app.io (injecté par fastify-socket.io)
@InjectPlugin('io')
private io!: any;

createUser(name: string) {
// Utilisation directe
this.db.prepare('INSERT INTO users ...').run(name);

// Notification
this.io.emit('new_user', { name });
}
}

2. La Roue de Secours : @Plugin (Pour les Contrôleurs) 🛟

À utiliser avec modération

L'utilisation de @Plugin dans un contrôleur est souvent le signe que de la logique métier "fuit" là où elle ne devrait pas être. Essayez toujours de déplacer cette logique dans un Service.

Ce décorateur de paramètre permet d'extraire un plugin depuis la requête HTTP courante (req.server).

Pourquoi c'est moins bien ?

Le Contrôleur (le Serveur 🤵) ne devrait pas cuisiner. S'il commence à manipuler la BDD directement via @Plugin('db'), tu brises la séparation des responsabilités.

Quand l'utiliser ?

Pour des cas très spécifiques liés à la requête HTTP elle-même, ou pour du prototypage rapide.

import { Controller, Get, Plugin } from 'my-fastify-decorators';

@Controller('/debug')
export class DebugController {

@Get()
getStats(@Plugin('redis') redis: any) {
// Exceptionnellement, on tape directement dans Redis pour une info rapide
return redis.get('server_stats');
}
}

Résumé Visuel

En Bref

DécorateurCibleSourceUsage Recommandé
@InjectPlugin('nom')Propriété de Serviceapp['nom']Toujours (BDD, Sockets, Config...)
@Plugin('nom')Paramètre de Contrôleurreq.server['nom']Rarement (Debugging, cas limites)