Découvrez l'architecture d'une application NestJS

Dans le chapitre précédent, nous avons réanimé le projet de notre startup en installant ses dépendances avec npm, et nous avons démarré notre serveur de développement. Votre environnement est maintenant prêt.

Mais que se cache-t-il réellement dans ce dossier de code ?

NestJS a généré plusieurs fichiers pour nous, et avant de commencer à programmer nos propres fonctionnalités, il est indispensable de comprendre comment tout cela s'articule. Voyons ensemble l'architecture de ce framework.

Découvrez NestJS et ses partis pris

Imaginons que vous deviez construire un grand immeuble avec une équipe de dix personnes. Si chacun apporte ses propres matériaux et décide librement de l'emplacement des murs, le résultat sera vite chaotique. C'est un peu ce qui se passe avec des frameworks Node.js très permissifs comme Express. Ils laissent une liberté totale aux développeurs, ce qui peut mener au désordre dans des projets complexes.

Pour des projets professionnels en équipe, nous avons besoin d'un architecte qui impose des règles de construction strictes. C'est exactement le rôle de NestJS.

NestJS est un framework Node.js progressif, pensé pour être robuste, facile à maintenir et scalable. Pour garantir cette fiabilité, il s'appuie sur trois grands partis pris :

  1. Il utilise TypeScript par défaut, ce qui permet d’ajouter le typage dans javascript n et d'éviter de nombreuses erreurs.

  2. Il propose une architecture modulaire, très fortement inspirée du célèbre framework front-end Angular.

  3. Il intègre nativement l'injection de dépendances.

L'injection de dépendances ? Qu'est-ce que c'est exactement ?

Rassurez-vous, nous n'entrerons pas dans les détails techniques de ce concept tout de suite. Retenez simplement pour le moment que c'est un mécanisme puissant qui permet à vos différents morceaux de code de communiquer facilement entre eux.

Illustration d’un développeur reliant une application à une base de données via une architecture avec NestJS et Node.js, montrant des échanges bidirectionnels et une connexion validée par une coche verte.
NestJS ajoute une couche d’organisation au back-end construit avec Node.js

Comprenez la structure d'un projet NestJS

Ouvrez le dossier de notre application de gestion de tâches dans votre éditeur de code. Vous y verrez une arborescence bien spécifique. Le dossier le plus important est le dossiersrc/, car c'est lui qui contient tout le code source de notre application. Vous y trouverez également un dossiertest/dédié aux tests automatisés.

Dans le dossiersrc/, regardons le fichiermain.ts. C'est le point de départ absolu de votre projet. Son rôle est de démarrer (ou "bootstraper") notre serveur pour qu'il puisse écouter les requêtes.

Le flux de démarrage d'une application NestJS est toujours le même : le fichiermain.tsappelle le fichierapp.module.ts, qui fait ensuite le lien vers les fichiersapp.controller.tsetapp.service.ts. Mais que représentent ces différents fichiers ? C'est le cœur de la logique de NestJS.

Dans cette vidéo, vous allez découvrir concrètement comment démarre une application NestJS.
Plutôt que de rester sur de la théorie, nous allons suivre pas à pas le chemin d’exécution : du point d’entréemain.ts, jusqu’au service métier, en passant par le module et le contrôleur.

Vous avez maintenant une vue claire du flux de démarrage d’une application NestJS. Tout commence dansmain.ts, qui lance l’application avecAppModule. Le module relie ensuite les différentes briques, le contrôleur reçoit les requêtes, et le service exécute la logique métier. Gardez bien ce chemin en tête car il constitue la base pour comprendre et construire n’importe quelle application NestJS.

Découvrez les trois blocs fondamentaux

L'architecture de NestJS repose sur une stricte séparation des responsabilités à travers trois concepts clés. Pour bien les comprendre, on peut faire le parallèle avec le fonctionnement d'une entreprise classique.

  1. Le Controller (contrôleur) : C'est l'accueil de l'entreprise. Sa seule mission est de recevoir les requêtes HTTP envoyées par les utilisateurs (les clients), de comprendre ce qu'ils demandent, et de leur renvoyer la réponse finale.

  2. Le Service : C'est l'équipe d'experts dans les bureaux. Le contrôleur ne fait aucun calcul lui-même, il délègue la demande au service. Le service contient toute la logique métier (le traitement des données, la validation, etc.).

  3. Le Module : C'est le département qui regroupe le personnel. Il rassemble les contrôleurs et les services qui travaillent sur un même domaine fonctionnel.

Par exemple, pour notre projet, nous aurons bientôt un module "Tâches" (le département), qui contiendra un contrôleur "Tâches" (pour recevoir les demandes de création de tâches) et un service "Tâches" (pour sauvegarder ces tâches).

Comprenez le rôle des décorateurs

En explorant les fichiersapp.controller.tsouapp.module.ts, vous remarquerez une syntaxe particulière : des mots précédés du symbole arobase (@), comme@Module()ou@Controller(). Ce sont des décorateurs TypeScript.

Un décorateur est une fonction spéciale qui permet d'ajouter des informations complémentaires (des métadonnées) à une classe ou à une méthode. Parmi les plus courants dans NestJS, vous retrouverez :

  • @Module()pour définir un module.

  • @Controller()pour définir un contrôleur.

  • @Get()pour indiquer qu'une méthode répond à une requête HTTP GET.

  • @Injectable()pour définir un service.

Mais comment fonctionne le code à l'intérieur de ces décorateurs ? Dois-je savoir les fabriquer moi-même ?

Pas du tout ! Il est inutile d'essayer de comprendre leur mécanique interne complexe à ce stade. Considérez simplement les décorateurs comme de petites "étiquettes" prêtes à l'emploi que vous collez sur votre code. En plaçant l'étiquette@Controller()au-dessus d'une classe, vous indiquez à NestJS : "occupe-toi de transformer cette classe en contrôleur HTTP". C'est tout ce dont vous avez besoin pour travailler efficacement.

En résumé

  • NestJS est un framework Node.js structurant, écrit en TypeScript, qui impose une architecture modulaire claire.

  • Tout projet NestJS démarre depuis le fichiermain.ts, qui bootstrap l'application via le module racine.

  • Les trois blocs fondamentaux de l'architecture sont : le Module (organisation), le Controller (gestion des requêtes HTTP), et le Service (logique métier).

  • Les décorateurs TypeScript (comme@Module,@Controller,@Get) agissent comme des étiquettes pour déclarer le rôle de chaque classe sans avoir à modifier leur logique complexe.

  • Cette architecture précise facilite grandement la collaboration en équipe et la maintenabilité du projet sur le long terme.

Vous savez maintenant comment s'organise une application NestJS et à quoi servent ses différents fichiers. Suivez-moi dans le prochain chapitre pour passer à l'action et créer votre toute première route HTTP !

Et si vous obteniez un diplôme OpenClassrooms ?
  • Formations jusqu’à 100 % financées
  • Date de début flexible
  • Projets professionnalisants
  • Mentorat individuel
Trouvez la formation et le financement faits pour vous