À propos de ce cours
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.
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.