À propos de ce cours
Objectifs du TP
- Créer une API NestJS et la publier sur GitHub dès le départ.
- Comprendre la structure d'un projet et le rôle de main.ts.
- Configurer l'application : préfixe, CORS, port, CLI.
- Ajouter des routes simples en respectant la séparation contrôleur / service.
- Livrer une version propre et documentée.
Durée: 2 h | Prérequis: chapitres 02 et 03 | Livrable: l'adresse du dépôt GitHub avec l'étiquette v0.1.0.
Un commit à la fin de chaque partie.
Contexte
Votre établissement souhaite une API pour gérer ses formations, ses groupes et ses stagiaires. Ce premier TP pose les fondations du projet api-formation: un projet propre, configuré, documenté et publié sur GitHub. Les fonctionnalités métier seront ajoutées dans les TP suivants.
Partie 1 Créer le projet et le dépôt GitHub
- Dans votre dossier de travail, créez le projet :
nest new api-formation --package-manager npm --strict - Sur GitHub, créez un dépôt public et vide nommé
api-formation. - Reliez le projet local au dépôt et poussez :
cd api-formation git add . git commit -m "chore: création du projet NestJS" git branch -M main git remote add origin https://github.com/VOTRE-COMPTE/api-formation.git git push -u origin main - Actualisez la page du dépôt : les fichiers du projet apparaissent, sans
node_modules.
Si Git répond « nothing to commit », le commit initial a déjà été fait par la CLI : continuez avec git branch -M main.
Partie 2 Explorer la structure du projet
- Lancez
npm run start:devet vérifiezhttp://localhost:3000. - Créez à la racine un fichier
STRUCTURE.mdqui décrit en une phrase le rôle de :main.ts,app.module.ts,app.controller.ts,app.service.ts,app.controller.spec.ts,test/app.e2e-spec.ts,nest-cli.json,tsconfig.json. - Dans ce même fichier, décrivez en 3 lignes le parcours d'une requête
GET /. - Lancez
npm run testetnpm run test:e2eet notez les résultats dansSTRUCTURE.md. - Commit :
docs: description de la structure du projetpuisgit push.
Partie 3 Configurer l'application
- Modifiez
src/main.tspour :- préfixer toutes les routes par
api; - autoriser CORS pour
http://localhost:4200(futur front-end Angular) ; - lire le port dans
process.env.PORT(3000 par défaut) ; - afficher au démarrage, avec le
Logger, le messageAPI api-formation démarrée sur http://localhost:3000/api.
- préfixer toutes les routes par
- Dans
nest-cli.json, désactivez la génération automatique des fichiers.spec.ts. - Dans
package.json, ajoutez le scriptverifierqui enchaîne lint, tests et build. - Vérifiez :
http://localhost:3000/apirépond « Hello World! » etnpm run verifierréussit. - Commit :
feat: configuration globale (préfixe api, CORS, port)puisgit push.
Le test e2e envoie GET / sans préfixe : il réussit quand même car il crée l'application à partir de AppModule sans passer par main.ts. Gardez cela en tête pour le chapitre 17.
Partie 4 Ajouter des routes d'information
Ajoutez les routes suivantes. La logique doit être dans AppService; le contrôleur ne fait qu'appeler le service.
| Route | Réponse attendue |
|---|---|
GET /api | "Bienvenue sur l'API de gestion de formation" |
GET /api/infos | { "application": "api-formation", "version": "0.1.0", "auteur": "Votre nom", "framework": "NestJS" } |
GET /api/sante | { "statut": "ok", "date": "2026-11-14T20:15:03.120Z", "dureeFonctionnement": 42 } (secondes depuis le démarrage) |
- Écrivez les trois méthodes dans le service et les trois routes dans le contrôleur.
- Créez le dossier
requetes/et le fichierrequetes/app.httpcontenant une requête pour chaque route (variable@baseUrl = http://localhost:3000/api). - Testez chaque route avec REST Client (ou Postman) et vérifiez le statut 200.
- Commit :
feat: routes infos et santepuisgit push.
Indice pour la durée de fonctionnement : process.uptime() renvoie le nombre de secondes écoulées depuis le démarrage du processus Node.js ; Math.round() arrondit le résultat.
Partie 5 Documenter et livrer la version 0.1.0
- Remplacez le contenu de
README.mdpar une documentation du projet comprenant : titre et description, prérequis (Node.js LTS, npm), installation (git clone,npm install), lancement (npm run start:dev), tableau des routes disponibles, auteur. - Vérifiez que tout est en ordre :
npm run verifier. - Commit :
docs: README du projetpuisgit push. - Créez et publiez l'étiquette de version :
git tag -a v0.1.0 -m "TP 1 : première version de l'API" git push origin v0.1.0 - Test final: dans un autre dossier, clonez votre dépôt, lancez
npm installpuisnpm run start:devet appelez/api/infos. Si tout fonctionne, le TP est livrable.
Pour aller plus loin
- Ajoutez une route
GET /api/infos/nodequi renvoie la version de Node.js (process.version) et le système (process.platform). - Faites la Partie 4 sur une branche
feature/routes-infoset fusionnez-la par une Pull Request. - Ajoutez dans
app.controller.spec.tsun test qui vérifie quegetInfos()renvoie bienapplication: 'api-formation'.
Correction (extraits)
Voir main.ts
import { Logger } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.setGlobalPrefix('api');
app.enableCors({ origin: ['http://localhost:4200'] });
const port = process.env.PORT ?? 3000;
await app.listen(port);
Logger.log(`API api-formation démarrée sur http://localhost:${port}/api`, 'Bootstrap');
}
bootstrap();
Voir app.service.ts et app.controller.ts
// app.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getAccueil(): string {
return "Bienvenue sur l'API de gestion de formation";
}
getInfos() {
return { application: 'api-formation', version: '0.1.0', auteur: 'Votre nom', framework: 'NestJS' };
}
getSante() {
return {
statut: 'ok',
date: new Date().toISOString(),
dureeFonctionnement: Math.round(process.uptime()),
};
}
}
// app.controller.ts
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getAccueil(): string {
return this.appService.getAccueil();
}
@Get('infos')
getInfos() {
return this.appService.getInfos();
}
@Get('sante')
getSante() {
return this.appService.getSante();
}
}
En renommant getHello() en getAccueil(), pensez à adapter app.controller.spec.ts et test/app.e2e-spec.ts (texte attendu), sinon npm run verifier échoue : c'est voulu, les tests protègent le comportement de l'API.
Voir requetes/app.http
@baseUrl = http://localhost:3000/api
### Accueil
GET {{baseUrl}}
### Informations
GET {{baseUrl}}/infos
### Santé
GET {{baseUrl}}/sante
Grille d'évaluation
| Critère | Points |
|---|---|
| Dépôt GitHub public, sans node_modules ni dist, au moins 5 commits aux messages clairs | 4 |
| STRUCTURE.md : rôle des fichiers et parcours d'une requête | 3 |
| main.ts : préfixe, CORS, port, message de démarrage | 4 |
| nest-cli.json et script verifier | 2 |
| Trois routes fonctionnelles, logique dans le service | 4 |
| requetes/app.http, README complet, étiquette v0.1.0 | 3 |
| Total | 20 |