Nestjs
Debutant
Quiz-Nestjs-Debutant
Nestjs-Modules
Nestjs-Controleurs
Nestjs-Services
Injection-Dependances
Questions-Entretien-Nestjs
Qcm-Nestjs
Apprendre-Nestjs
Typescript
Node-Js
Framework-Backend
Back-End
📝
NestJS Débutant — Modules & Services
20 questions sur les bases de NestJS : modules, contrôleurs, services, injection de dépendances et gestion des routes. Idéal pour préparer un entretien développeur NestJS débutant.
Banque de révision : les 30 questions corrigées
Voici l'intégralité des 30 questions de « NestJS Débutant — Modules & Services », chacune avec sa bonne réponse et son explication. Le quiz interactif ci-dessus en tire une sélection aléatoire à chaque tentative — utilisez cette liste complète pour réviser.
Explication :
NestJS est un framework backend pour Node.js qui utilise TypeScript par défaut. Il s'inspire de l'architecture d'Angular (modules, décorateurs, injection de dépendances) et supporte Express ou Fastify comme moteur HTTP sous-jacent.
NestJS est idéal pour construire des API REST, GraphQL, microservices, ou applications full-stack avec une architecture modulaire et testable.
Explication :
La commande
nest new nom-projet crée un nouveau projet NestJS avec la structure de dossiers standard, les fichiers de configuration, et installe les dépendances nécessaires.
Assurez-vous d'avoir installé NestJS CLI globalement :
npm install -g @nestjs/cli.
Explication :
Le décorateur
@Controller() est utilisé pour définir une classe comme contrôleur NestJS. Il peut prendre un paramètre optionnel pour spécifier le préfixe de route : @Controller("users").
Les contrôleurs sont responsables de la gestion des requêtes entrantes et du renvoi des réponses au client.
Explication :
Le décorateur
@Get() est utilisé pour associer une méthode de contrôleur à une requête HTTP GET. On peut spécifier un chemin : @Get("users").
Les autres décorateurs HTTP sont :
@Post(), @Put(), @Delete(), @Patch(), @Options(), @Head().
Explication :
Le décorateur
@Param("id") extrait le paramètre de route nommé "id". Si on utilise @Param() sans argument, on récupère tout l'objet params.
Exemple :
@Get(":id") findOne(@Param("id") id: string) { return this.service.findOne(id); }
Explication :
Le décorateur
@Query() extrait les paramètres de la query string. @Query("page") récupère la valeur spécifique, @Query() récupère tout l'objet query.
Exemple :
findAll(@Query("limit") limit: number) { ... } pour une URL du type /users?limit=10.
Explication :
Le décorateur
@Body() permet d'extraire le corps de la requête. On peut aussi typer avec un DTO : @Body() createUserDto: CreateUserDto.
NestJS utilise automatiquement class-validator et class-transformer si configurés pour valider le corps de la requête.
Explication :
Un DTO (Data Transfer Object) est une classe qui définit la forme et le type des données envoyées ou reçues par l'API. Il est souvent utilisé avec
@Body() pour la validation et la documentation automatique (Swagger).
Exemple :
export class CreateUserDto { name: string; email: string; }
Explication :
Le décorateur
@Injectable() marque une classe comme pouvant être gérée par le conteneur d'injection de dépendances de NestJS. Les services, repositories, factories, helpers utilisent ce décorateur.
Un service injectable peut être injecté dans des contrôleurs, d'autres services, ou des guards.
Explication :
La méthode principale est l'injection par constructeur, préférée par NestJS. On peut aussi utiliser
@Inject() sur une propriété, mais c'est moins courant. L'injection par constructeur est plus testable et claire.
NestJS utilise l'injection de dépendances d'Angular. Le type est automatiquement reconnu grâce à TypeScript.
Explication :
Un module est une classe décorée avec
@Module(). Il regroupe les contrôleurs, services, et autres providers liés à une fonctionnalité. Chaque application NestJS a au moins un module racine (AppModule).
Les modules permettent d'organiser le code, d'importer des fonctionnalités d'autres modules, et d'exporter des providers.
Explication :
Le décorateur
@Module() accepte un objet avec : controllers (les contrôleurs du module), providers (les services injectables), imports (autres modules requis), exports (providers à partager avec d'autres modules).
Exemple :
@Module({ controllers: [UserController], providers: [UserService], exports: [UserService] })
Explication :
La commande
nest generate controller users (ou nest g co users) crée un fichier contrôleur, un fichier de test, et l'enregistre automatiquement dans le module approprié.
Autres générateurs :
nest g service, nest g module, nest g class, nest g interface, nest g guard.
Explication :
npm run start:dev utilise le mode watch (recompilation automatique) avec rechargement à chaud. Cela utilise le script défini dans package.json : "start:dev": "nest start --watch".
Pour la production, utilisez
npm run start:prod (build puis node dist/main.js).
Explication :
Le fichier
main.ts est le point d'entrée. Il utilise NestFactory.create() pour créer une instance de l'application (généralement AppModule), puis app.listen() pour démarrer le serveur.
Exemple typique :
async function bootstrap() { const app = await NestFactory.create(AppModule); await app.listen(3000); } bootstrap();
Explication :
Par défaut, NestJS écoute sur le port 3000. On peut modifier le port en passant un paramètre à
app.listen(3000) ou via une variable d'environnement.
Pour utiliser un port dynamique :
const port = process.env.PORT || 3000; await app.listen(port);
Explication :
Les pipes sont exécutés avant le contrôleur. Ils peuvent : transformer les données (ex: string en number), valider les données (ex: vérifier qu'un email est valide), ou générer des erreurs (BadRequestException).
Pipes intégrés :
ValidationPipe, ParseIntPipe, ParseBoolPipe, ParseUUIDPipe.
Explication :
Pour utiliser
ValidationPipe : 1) Installer class-validator et class-transformer. 2) Activer le pipe globalement (app.useGlobalPipes(new ValidationPipe())) ou localement. 3) Utiliser les décorateurs de validation dans les DTOs (@IsString(), @IsEmail(), etc.).
Exemple DTO :
export class CreateUserDto { @IsString() name: string; @IsEmail() email: string; }
Explication :
Les guards (gardiens) sont exécutés avant les pipes. Ils retournent un booléen ou une Promesse/Observable de booléen. Si true, la requête continue ; si false, une exception ForbiddenException est levée.
Exemple : guard d'authentification JWT, guard de rôle (Admin, User). Décorateur
@Injectable() et CanActivate.
Explication :
Les intercepteurs permettent d'exécuter du code avant et après l'exécution du contrôleur. Cas d'usage : logging, transformation des réponses (ex: wrapper standard), mise en cache, gestion des temps d'exécution.
Un intercepteur implémente l'interface
NestInterceptor avec la méthode intercept(context, next).
Explication :
Le décorateur
@HttpCode(201) permet de définir le code de statut HTTP de la réponse. Par défaut, POST retourne 201, GET retourne 200.
Exemple :
@Post() @HttpCode(201) create() { return this.service.create(); }
Explication :
NestJS fournit une couche d'exceptions intégrée. On peut lancer
throw new NotFoundException("User not found"). NestJS capture automatiquement l'exception et envoie une réponse HTTP appropriée.
Pour créer une exception personnalisée :
export class ForbiddenException extends HttpException { constructor() { super("Forbidden", HttpStatus.FORBIDDEN); } }
Explication :
Par défaut, NestJS utilise Express. Fastify est une alternative plus récente, offrant de meilleures performances (requêtes/sec plus élevées, moins de mémoire). On peut choisir Fastify avec
NestFactory.create<NestFastifyApplication>(...).
Pour utiliser Fastify, installez
@nestjs/platform-fastify au lieu de @nestjs/platform-express.
Explication :
On peut ajouter un middleware de deux façons : 1) directement avec
app.use(loggerMiddleware) dans main.ts. 2) Créer une classe implémentant NestMiddleware avec la méthode use(req, res, next) et l'enregistrer dans un module avec configure().
Les middlewares fonctionnent comme dans Express/Fastify. Ils sont exécutés avant les guards et les pipes.
Explication :
Le fichier
.env (et .env.development, .env.production) stocke les variables d'environnement. NestJS peut utiliser @nestjs/config pour charger automatiquement ce fichier et fournir un service ConfigService.
Ne commitez jamais le fichier .env (ajoutez-le à .gitignore). Utilisez .env.example pour documenter les variables nécessaires.
Explication :
Les deux méthodes fonctionnent. La meilleure pratique est d'utiliser
@nestjs/config avec ConfigService qui offre typage, validation, et meilleure testabilité. process.env reste accessible mais moins élégant.
Exemple avec ConfigService :
constructor(private configService: ConfigService) { const port = this.configService.get("PORT"); }
Explication :
Par défaut, les providers sont des singletons (DEFAULT). On peut changer le scope avec
@Injectable({ scope: Scope.REQUEST }) pour avoir une instance par requête (utile pour les données utilisateur), ou Scope.TRANSIENT pour une nouvelle instance à chaque injection.
Attention : le scope REQUEST peut avoir un impact sur les performances. À utiliser uniquement quand nécessaire.
Explication :
Les dépendances circulaires (ModuleA importe ModuleB et ModuleB importe ModuleA) peuvent être résolues avec
forwardRef(() => ModuleB) dans les imports et @Inject(forwardRef(() => ServiceB)) dans les constructeurs.
La meilleure solution est de restructurer le code pour éviter les cycles. forwardRef est une solution de dernier recours.
Explication :
Le module
@nestjs/swagger génère automatiquement une documentation OpenAPI (Swagger) en analysant les contrôleurs, DTOs, et décorateurs. Il fournit une interface interactive (Swagger UI) pour tester l'API.
Décorateurs utiles :
@ApiTags(), @ApiOperation(), @ApiResponse(), @ApiProperty().
Explication :
NestJS fournit
Test.createTestingModule() pour créer un module de test isolé. On peut fournir des mocks pour les providers (.overrideProvider()) et tester le contrôleur sans dépendances réelles.
Exemple :
const module = await Test.createTestingModule({ controllers: [UserController], providers: [{ provide: UserService, useValue: mockUserService }] }).compile();