Aller au contenu
NestJS OpenPartie 4, section f
Changer de langue : lire en anglais

f · Point d'étape : quiz

  • Environ 15 minutes

Tu as couvert le web, JavaScript et TypeScript, un serveur Node fait main, Express, puis tes premiers pas avec NestJS et la validation. Avant le projet bonus qui suit, treize questions pour vérifier ce qui est resté. Essaie de répondre avant d’ouvrir chaque réponse.

1. Ton navigateur envoie GET /api/villages et le serveur traite la requête sans problème. Quel code de statut HTTP reçoit-il ?

200. C’est le code générique de succès — tu en croiseras d’autres plus loin dans le cours (201 à la création, 400 en cas de requête invalide, 404 si la ressource n’existe pas).

2. Une méthode de controller NestJS renvoie { id, phase: ‘nuit’, tour: 3 }. Que doit faire ton code pour que ce soit envoyé en JSON au client ?

Rien de plus : NestJS sérialise automatiquement en JSON tout objet JavaScript renvoyé par une méthode de controller.

3. Quelle est la différence entre let et const ?

const empêche de réassigner la variable (x = autreChose est refusé), let le permet. Ni l’un ni l’autre ne rend un objet ou un tableau immuable : const village = { nom: ‘A’ }; village.nom = ‘B’ est parfaitement valide.

4. Tu attends trois requêtes indépendantes avec trois await à la suite, plutôt qu’avec Promise.all. Quelle est la conséquence ?

Les trois requêtes s’enchaînent l’une après l’autre au lieu de partir en même temps — ton code attend trois fois plus longtemps qu’il ne le faudrait, sans aucune erreur pour te le signaler.

5. À quoi sert une interface TypeScript comme interface Joueur { pseudo: string; role: Role } ?

Elle décrit la forme qu’un objet doit avoir — uniquement à la compilation. Elle ne génère aucun code, ne vérifie rien à l’exécution, et ne peut donc jamais remplacer une vraie validation comme celle de la partie 4.

6. Un décorateur de classe comme @Journal() ci-dessus (partie 1, section d) s’exécute-t-il à la déclaration de la classe, ou à chaque fois qu’on en crée une instance avec new ?

À la déclaration — une seule fois, au chargement du fichier. @Controller(...) ou @Injectable() suivent exactement le même principe : NestJS les lit pour assembler ton application, pas à chaque requête.

7. Quelle est la différence entre app.use(middleware) et app.get(chemin, gestionnaire) ?

app.use s’applique à toutes les requêtes, dans l’ordre où tu l’ajoutes. app.get ne répond qu’à une route précise, en GET.

8. Un middleware Express oublie d’appeler next() et ne répond pas non plus lui-même. Que se passe-t-il ?

La requête reste bloquée indéfiniment : rien n’a été renvoyé au client, et rien n’a transmis la main au middleware ou à la route suivante.

9. Dans @Module({ controllers: […], providers: [VillagesService], exports: [VillagesService] }), à quoi sert exports ?

Sans lui, VillagesService reste invisible en dehors de son propre module — même un module qui l’imports ne pourrait pas l’injecter. exports le rend disponible pour les autres modules.

10. VillagesController reçoit VillagesService par son constructeur. Qui appelle réellement new VillagesService() ?

NestJS lui-même — jamais toi. C’est le principe de l’injection de dépendances : tu déclares ce dont ta classe a besoin, le framework se charge de le construire et de le fournir.

11. Ton DTO a bien @IsInt() @Min(3) nombreDeJoueurs: number, mais tu obtiens toujours un 201 même avec nombreDeJoueurs: 1. Qu’as-tu probablement oublié ?

D’activer app.useGlobalPipes(new ValidationPipe()) dans main.ts. Les décorateurs décrivent les règles ; sans ValidationPipe, rien ne les fait respecter à l’exécution.

12. Que change forbidNonWhitelisted: true par rapport à whitelist: true seul ?

whitelist: true seul retire silencieusement les champs absents du DTO. En ajoutant forbidNonWhitelisted: true, ces champs en trop font échouer la requête avec un 400, au lieu d’être ignorés sans prévenir personne.

13. Pourquoi valider les variables d’environnement au démarrage (avec validate dans ConfigModule.forRoot), plutôt que de laisser ConfigService.get(‘NOMBRE_MAX_VILLAGES’) renvoyer undefined ?

Un .env incomplet plante sinon bien plus tard, au premier endroit où la valeur manquante est utilisée — potentiellement en pleine requête d’un vrai utilisateur. Valider au démarrage fait échouer immédiatement, avec un message qui nomme la variable en cause.

Si la plupart de ces réponses te semblaient familières, le projet bonus qui suit est fait pour toi : une petite API sur le thème du basketball NBA, à construire avec exactement ce que tu viens de réviser.