Comment démarrer rapidement avec VUE3.0 : Entrez et apprenez
Nest.js est un framework back-end de Nodejs. Il encapsule Express et d'autres plates-formes http pour résoudre des problèmes d'architecture. Il fournit MVC, IOC, AOP et d'autres fonctionnalités architecturales qu'Express n'a pas, ce qui rend le code plus facile à maintenir et à développer.
Que signifient ici MVC, IOC et AOP ? Examinons-les séparément :
MVC est l'abréviation de Model View Controller. Sous l'architecture MVC, la requête sera d'abord envoyée au Contrôleur, qui enverra le Service de la couche Modèle pour compléter la logique métier, puis renverra la Vue correspondante.
Nest.js fournit le décorateur @Controller pour déclarer Controller :
La Prestation sera déclarée auprès du décorateur @Injectable :
Les classes déclarées via les décorateurs @Controller et @Injectable seront analysées par Nest.js, les objets correspondants seront créés et ajoutés à un conteneur. Tous ces objets seront automatiquement injectés en fonction des dépendances déclarées dans le constructeur, c'est-à-dire DI (dépendance). inject) ), cette idée est appelée IOC (Inverse Of Control).
L'avantage de l'architecture IOC est qu'il n'est pas nécessaire de créer manuellement des objets et de les transmettre aux constructeurs de différents objets en fonction des dépendances. Tout est automatiquement analysé, créé et injecté.
De plus, Nest.js offre également la capacité d'AOP (Aspect Oriented Programming), qui est la capacité de programmation orientée aspect :
Que signifie AOP ? Qu’est-ce que la programmation orientée aspect ?
Une requête peut passer par la logique du Contrôleur, du Service et du Référentiel (accès à la base de données) :
Si vous souhaitez ajouter une logique générale à ce lien d'appel, comment devez-vous l'ajouter ? Tels que la journalisation, le contrôle des autorisations, la gestion des exceptions, etc.
Ce qui est facile à penser, c'est de transformer directement le code de la couche Contrôleur et d'ajouter cette logique. Cela fonctionne, mais ce n'est pas élégant car ces logiques communes envahissent la logique métier. Pouvons-nous ajouter de manière transparente des journaux, des autorisations, etc. à ces logiques métier ?
Est-il possible d'ajouter une étape pour exécuter une logique commune avant et après l'appel du contrôleur ?
Par exemple:
De tels points d'expansion horizontaux sont appelés aspects, et cette méthode de programmation qui ajoute de manière transparente une logique d'aspect est appelée AOP (programmation orientée aspect).
L'avantage d'AOP est qu'il peut séparer une certaine logique générale en aspects et garder la logique métier pure. De cette façon, la logique d'aspect peut être réutilisée et ajoutée et supprimée de manière dynamique.
En fait, le modèle oignon du middleware d'Express est également une implémentation. d'AOP, car vous pouvez envelopper un calque à l'extérieur de manière transparente et ajouter une certaine logique, et le calque intérieur ne sera pas perceptible.
Nest.js a plus de moyens d'implémenter AOP, il y en a cinq au total, dont Middleware, Guard, Pipe, Inteceptor, ExceptionFilter :,
Nest.js est basé sur Express et peut naturellement utiliser un middleware, mais il a été subdivisé davantage. , divisé en middleware global et middleware de routage :
le middleware global est le middleware d'Express. Une certaine logique de traitement est ajoutée avant et après la requête. Chaque requête sera placée ici :
Le middleware de routage est destiné à un certain itinéraire, avec une portée plus petite :
Ce concept hérite directement d’Express et est plus simple à comprendre.
Jetons un coup d'œil à certains concepts étendus de Nest.js, tels que Guard :
Guard signifie garde de routage. Il peut être utilisé pour déterminer les autorisations avant d'appeler un contrôleur et renvoyer vrai ou faux pour décider de libérer :
La manière de créer une garde est la suivante :
Guard doit implémenter l'interface CanActivate et la méthode canActive. Il peut obtenir les informations demandées à partir du contexte, puis effectuer une vérification des autorisations et d'autres traitements avant de renvoyer vrai ou faux.
Ajoutez-le au conteneur IOC via le décorateur @Injectable, puis activez-le dans un contrôleur :
Le contrôleur lui-même n'a pas besoin d'être modifié, mais la logique de jugement d'autorisation est ajoutée de manière transparente. C'est l'avantage de l'architecture AOP.
Et, tout comme le Middleware prend en charge les niveaux globaux et de routage, Guard peut également être activé globalement :
Guard peut faire abstraction de la logique de contrôle d'accès du routage, mais ne peut pas modifier les requêtes et les réponses. Cette logique peut utiliser Interceptor :
Interceptor signifie intercepteur. Vous pouvez ajouter de la logique avant et après la méthode du contrôleur cible :
La manière de créer un Inteceptor est la suivante :
L'intercepteur doit implémenter l'interface NestInterceptor et la méthode d'interception appellera le contrôleur cible. Vous pouvez ajouter une logique de traitement avant et après.
La logique de traitement avant et après le contrôleur peut être asynchrone. Nest.js les organise via rxjs, vous pouvez donc utiliser différents opérateurs de rxjs.
Interceptor prend en charge l'activation de chaque route individuellement, ce qui n'affecte qu'un certain contrôleur, et prend également en charge l'activation globale, qui affecte tous les contrôleurs :
En plus du contrôle des autorisations des routes et du traitement avant et après le contrôleur cible, qui sont tous une logique commune, le traitement des paramètres est également une logique commune, donc Nest.js extrait également les aspects correspondants, c'est-à-dire Pipe :
Pipe signifie pipe , utilisé pour effectuer une vérification et une conversion des paramètres :
La manière de créer un Pipe est la suivante :
Pipe doit implémenter l'interface PipeTransform et la méthode de transformation, qui peuvent effectuer une vérification des paramètres sur la valeur du paramètre entrant, par exemple si le format et le type sont corrects. S'ils ne sont pas corrects, une exception sera levée. Vous pouvez également effectuer une conversion et renvoyer la valeur convertie.
Il existe 8 Pipes intégrés, et leurs significations peuvent être vues à partir des noms :
ValidationPipe
ParseIntPipe
ParseBoolPipe
ParseArrayPipe
ParseUUIDPipe
DefaultValuePipe
ParseEnumPipe
ParseFloatPipe
De même, Pipe ne peut prendre effet que sur une certaine route, ou il peut prendre effet sur chaque route :
Que ce soit Pipe, Guard, Interceptor ou le Controller qui soit finalement appelé, certaines exceptions peuvent être levées au cours du processus. Comment répondre à certaines exceptions ?
Ce mappage des exceptions aux réponses est également une logique courante. Nest.js fournit ExceptionFilter pour prendre en charge :
ExceptionFilter peut gérer les exceptions levées et renvoyer les réponses correspondantes :
La forme de création d'ExceptionFilter est la suivante :
Tout d'abord, vous devez implémenter l'interface ExceptionFilter et la méthode catch pour intercepter les exceptions. Cependant, les exceptions que vous souhaitez intercepter doivent être déclarées avec le décorateur @Catch. Après avoir intercepté l'exception, vous pouvez répondre avec l'exception correspondante pour donner l'exception. à l'utilisateur une invite plus conviviale.
Bien
GatewayTimeoutException
NotImplementedException
ServiceUnavailableException
InternalServerErrorException
GoneException
PayloadTooLargeException
UnprocessableException
ConflictException
BadGatewayException
UnsupportedMediaTypeException
BadRequestException
UnauthorizedException
NotFoundException
ForbiddenException
NotAcceptableException
RequestTimeoutException
Bien sûr, vous pouvez également l'étendre vous-même :
Nest.js réalise ainsi la correspondance entre les exceptions et les réponses. Tant que différentes HttpExceptions sont levées dans le code, les réponses correspondantes seront renvoyées, ce qui est très pratique.
De même, ExceptionFilter peut également choisir de prendre effet globalement ou de prendre effet sur un certain itinéraire :
un certain itinéraire :
Mondial:
Nous comprenons le mécanisme AOP fourni par Nest.js, mais quelle est leur relation d'ordre ?
Middleware, Guard, Pipe, Interceptor et ExceptionFilter, peut ajouter de manière transparente une certaine logique de traitement à une certaine route ou à toutes les routes. C'est l'avantage de l'AOP.
Mais quelle est la relation séquentielle entre eux ?
La relation d'appel dépend du code source.
Le code source correspondant est le suivant :
Évidemment, lors de l'entrée sur cette route, le garde sera appelé en premier pour déterminer s'il y a une autorisation, etc. S'il n'y a pas d'autorisation, une exception sera levée ici :
L'exception HttpException levée sera gérée par ExceptionFilter.
Si vous avez la permission, l'intercepteur sera appelé. L'intercepteur organise une chaîne, appelle un par un, et enfin appelle la méthode du contrôleur :
Avant d'appeler la méthode du contrôleur, pipe sera utilisé pour traiter les paramètres :
Chaque paramètre sera converti :
Il est facile de penser au timing d’appel de ExceptionFilter, qui consiste à gérer l’exception avant de répondre.
Le middleware est un concept express, Nest.js en hérite simplement et il est appelé au niveau de la couche la plus externe.
Il s'agit de la séquence d'appel de ces mécanismes AOP. Une fois que vous aurez réglé ces problèmes, vous aurez une bonne compréhension de Nest.js.
Nest.js est encapsulé sur la base de la plate-forme http express et applique des idées architecturales telles que MVC, IOC et AOP.
MVC est la division du contrôleur de modèle et de vue. La requête passe d'abord par le contrôleur, puis appelle le service et le référentiel de la couche modèle pour compléter la logique métier, et renvoie enfin la vue correspondante.
IOC signifie que Nest.js analysera automatiquement les classes avec les décorateurs @Controller et @Injectable, créera leurs objets et injectera automatiquement les objets dont il dépend en fonction des dépendances, éliminant ainsi les problèmes de création et d'assemblage manuels d'objets.
AOP extrait la logique générale et l'ajoute à un certain endroit via des aspects. Il peut réutiliser et ajouter et supprimer dynamiquement une logique d'aspect.
Le Middleware, Guard, Interceptor, Pipe et ExceptionFileter de Nest.js sont tous des implémentations d'idées AOP. Ce ne sont que des aspects à différents endroits. Ils peuvent tous être appliqués de manière flexible à un certain itinéraire ou à tous les itinéraires.
Nous avons examiné leur séquence d'appel à travers le code source. Le middleware est le concept d'Express. Dans la couche la plus externe, après avoir atteint une certaine route, Guard sera d'abord utilisé pour déterminer si la route a l'autorisation d'accéder, puis. L'intercepteur sera appelé. Développez une certaine logique d'avant en arrière et appelez Pipe pour vérifier et convertir les paramètres avant d'atteindre le contrôleur cible. Toutes les exceptions HttpException seront gérées par ExceptionFilter et renverront des réponses différentes.
Nest.js utilise cette architecture AOP pour obtenir une architecture faiblement couplée, facile à maintenir et à étendre.
Avez-vous ressenti les avantages de l’architecture AOP ?