Passer au contenu

Middleware

Les middleware sont des fonctions appelées avant le gestionnaire de route. Les fonctions middleware ont accès aux objets de demande et de réponse, ainsi qu’à la fonction middleware next() dans le cycle de demande-réponse de l’application. La fonction middleware next est généralement représentée par une variable nommée next.

Image illustrative

Les middleware Nest sont, par défaut, équivalents aux middleware express. La description suivante tirée de la documentation officielle d’express décrit les capacités des middleware :

Vous implémentez des middleware Nest personnalisés soit sous forme de fonction, soit dans une classe avec un décorateur @Injectable(). La classe doit implémenter l’interface NestMiddleware, tandis que la fonction n’a pas de exigences particulières.

logger.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log('Request...');
next();
}
}

Injection de dépendance

Les middleware Nest prennent entièrement en charge l’injection de dépendances. Tout comme pour les fournisseurs et les contrôleurs, ils peuvent injecter des dépendances disponibles dans le même module. Comme d’habitude, cela se fait par le biais du constructeur.

Application des middleware

Il n’y a pas de place pour les middleware dans le décorateur @Module(). Au lieu de cela, nous les configurons en utilisant la méthode configure() de la classe de module. Les modules qui incluent des middleware doivent implémenter l’interface NestModule. Configurons le LoggerMiddleware au niveau du AppModule.

app.module.ts
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { LoggerMiddleware } from './common/middleware/logger.middleware';
import { CatsModule } from './cats/cats.module';
@Module({
imports: [CatsModule],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes('cats');
}
}

Dans l’exemple ci-dessus, nous avons configuré le LoggerMiddleware pour les gestionnaires de route /cats qui étaient précédemment définis dans le CatsController. Nous pouvons également restreindre davantage un middleware à une méthode de demande particulière en passant un objet contenant le path de la route et la method de requête à la méthode forRoutes() lors de la configuration du middleware.

Exclusion des routes

Il arrive que nous souhaitions exclure certaines routes de l’application des middleware. Nous pouvons facilement exclure certaines routes avec la méthode exclude(). Cette méthode peut prendre une seule chaîne, plusieurs chaînes ou un objet RouteInfo identifiant les routes à exclure, comme indiqué ci-dessous :

consumer
.apply(LoggerMiddleware)
.exclude(
{ path: 'cats', method: RequestMethod.GET },
{ path: 'cats', method: RequestMethod.POST },
'cats/(.*)',
)
.forRoutes(CatsController);