Avez-vous une question? (216) 97 656 803 hajjriadh@gmail.com
NestJS

Le point d'entrée main.ts et le démarrage de l'application (NestFactory)

Cette leçon détaille le fichier main.ts, point d'entrée d'une application NestJS : la fonction bootstrap, la création de l'application avec NestFactory.create, les étapes du démarrage, puis les réglag...

0 chapitres 0 QCM Accès gratuit
Le point d'entrée main.ts et le démarrage de l'application (NestFactory)

À propos de ce cours

Cette leçon détaille le fichier main.ts, point d'entrée d'une application NestJS : la fonction bootstrap, la création de l'application avec NestFactory.create, les étapes du démarrage, puis les réglages courants : préfixe global des routes (/api), activation de CORS, niveaux de journalisation, port lu dans une variable d'environnement, message de démarrage avec le Logger et arrêt propre. Elle se termine par un main.ts complet et commenté.

Objectifs de la leçon

  • Expliquer le rôle de la fonction bootstrap et de NestFactory.
  • Ajouter un préfixe global et activer CORS.
  • Configurer le port et la journalisation.
  • Écrire un main.ts complet et lisible.
La fonction bootstrap

« Bootstrap » signifie amorçage. Cette fonction est asynchrone (async) car la création de l'application et le démarrage du serveur prennent du temps : on les attend avec await.

Démarrage d'une application NestJS avec NestFactory

NestFactory lit les modules, crée les objets, puis on configure l'application avant de la mettre à l'écoute.

NestFactory.create

NestFactory.create(AppModule) parcourt le module racine et tous les modules importés, crée les services et les contrôleurs, résout l'injection de dépendances, puis renvoie l'objet app. Si une dépendance manque, c'est ici que l'erreur apparaît.

Un second paramètre facultatif accepte des options :

const app = await NestFactory.create(AppModule, {
  logger: ['error', 'warn', 'log'],   // niveaux de journalisation affichés
  cors: true,                          // autre façon d'activer CORS
});
Le préfixe global

Une API expose généralement toutes ses routes sous /api. Plutôt que de l'écrire dans chaque contrôleur :

app.setGlobalPrefix('api');
// GET /         →  GET /api
// GET /version  →  GET /api/version
Activer CORS

Par sécurité, un navigateur bloque les requêtes d'une page vers un autre domaine ou port que le sien. Une application Angular servie sur http://localhost:4200 ne peut donc pas appeler l'API sur http://localhost:3000 sans autorisation. C'est le rôle de CORS (Cross-Origin Resource Sharing) :

app.enableCors({
  origin: ['http://localhost:4200'],          // front-ends autorisés
  methods: ['GET', 'POST', 'PATCH', 'PUT', 'DELETE'],
});

app.enableCors() sans paramètre autorise toutes les origines : pratique en développement, à restreindre en production (chapitres 18 et 19). Postman, Thunder Client et curl ne sont pas concernés par CORS : seuls les navigateurs l'appliquent.

Le port et le message de démarrage
import { Logger } from '@nestjs/common';

const port = process.env.PORT ?? 3000;
await app.listen(port);
Logger.log(`API démarrée sur ${await app.getUrl()}/api`, 'Bootstrap');

Le Logger de NestJS affiche des messages formatés et colorés, avec la date et un contexte ([Bootstrap]), comme les messages du framework.

L'arrêt propre

app.enableShutdownHooks() permet à l'application de fermer proprement ses ressources (connexions à la base de données, tâches en cours) quand le serveur reçoit un signal d'arrêt, par exemple lors d'un redéploiement.

Un main.ts complet
import { Logger } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  // 1. Création de l'application à partir du module racine
  const app = await NestFactory.create(AppModule);

  // 2. Configuration globale
  app.setGlobalPrefix('api');
  app.enableCors({ origin: ['http://localhost:4200'] });
  app.enableShutdownHooks();

  // 3. Démarrage du serveur
  const port = process.env.PORT ?? 3000;
  await app.listen(port);
  Logger.log(`API démarrée sur http://localhost:${port}/api`, 'Bootstrap');
}

bootstrap();

Dans les prochains chapitres, main.ts accueillera d'autres réglages globaux : la validation des données (useGlobalPipes, chapitre 08), les filtres d'exception (chapitre 09), la documentation Swagger (chapitre 14) et la sécurité (chapitre 19).

Activités

Activité 1 Préfixer l'API

Ajoutez le préfixe api. Testez http://localhost:3000 puis http://localhost:3000/api. Quels codes de statut obtenez-vous ?

Voir le corrigé

/ renvoie maintenant 404 (« Cannot GET / ») et /api renvoie 200 « Hello World! ». Le terminal affiche Mapped {/api, GET} route.

Activité 2 Un message de démarrage clair

Remplacez la dernière ligne de bootstrap pour afficher, avec le Logger, l'adresse complète de l'API. Modifiez ensuite les options de NestFactory.create pour n'afficher que les erreurs et les avertissements : que devient le terminal au démarrage ?

Voir le corrigé

Avec logger: ['error', 'warn'], les messages de démarrage (InstanceLoader, RoutesResolver…) et votre Logger.log disparaissent : seuls les avertissements et erreurs restent. C'est un réglage courant en production ; remettez la configuration par défaut pour la suite.

Activité 3 Observer CORS

Sans appeler enableCors, ouvrez une page quelconque (par exemple https://example.com), ouvrez la console (F12) et tapez :

fetch('http://localhost:3000/api').then(r => r.text()).then(console.log)

Lisez le message, activez CORS avec app.enableCors(), puis recommencez.

Voir le corrigé

Sans CORS, la console affiche une erreur « blocked by CORS policy : No 'Access-Control-Allow-Origin' header ». Après app.enableCors(), la réponse « Hello World! » s'affiche : l'API envoie l'en-tête Access-Control-Allow-Origin: *.

À retenir

  • main.ts contient la fonction asynchrone bootstrap, exécutée au démarrage.
  • NestFactory.create(AppModule) construit toute l'application et l'injection de dépendances.
  • setGlobalPrefix('api') préfixe toutes les routes.
  • enableCors autorise un front-end d'une autre origine à appeler l'API.
  • Le port se lit dans process.env.PORT, avec 3000 par défaut.