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
.
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.
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
.
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);