Préparation d'entretien 100% Gratuit angularforall.com

NestJS Débutant — Modules & Services

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
Débutant 🔀 Mixte 20 questions ⏱ 15 min
📝

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.

20 questions ⏱ ~15 min Niveau Débutant

Partager

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.

  • Un framework backend progressif pour Node.js utilisant TypeScript et inspiré d'Angular (bonne réponse)
  • Une base de données NoSQL
  • Un framework front-end comme React
  • Un gestionnaire de paquets Node.js
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.

  • nest new nom-projet (bonne réponse)
  • nestjs create nom-projet
  • npm create nestjs nom-projet
  • nest start nom-projet
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.

  • @Controller() (bonne réponse)
  • @RestController()
  • @Component()
  • @Injectable()
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.

  • @Get() (bonne réponse)
  • @GetMapping()
  • @HttpGet()
  • @GetRoute()
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().

  • @Param("id") (bonne réponse)
  • @Query("id")
  • @Body("id")
  • @Req().params.id
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); }

  • @Query("page") (bonne réponse)
  • @Param("page")
  • @Body("page")
  • @Req().query.page
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.

  • @Body() (bonne réponse)
  • @Request()
  • @Payload()
  • @Data()
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.

  • Une classe TypeScript qui définit la structure des données échangées entre client et serveur (bonne réponse)
  • Une base de données
  • Un type spécial de contrôleur
  • Un fichier de configuration
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; }

  • @Injectable() (bonne réponse)
  • @Service()
  • @Provider()
  • @Component()
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.

  • Dans le constructeur : constructor(private userService: UserService) {}
  • Avec @Inject() dans une propriété
  • Avec @Autowired()
  • Les deux réponses A et B sont correctes selon le contexte (bonne réponse)
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.

  • Une classe décorée avec @Module() qui organise l'application en blocs fonctionnels (bonne réponse)
  • Un fichier JavaScript
  • Une base de données
  • Un type de contrôleur
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.

  • controllers, providers, imports, exports (bonne réponse)
  • routes, services, models
  • components, directives, pipes
  • middleware, guards, interceptors
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] })

  • nest generate controller users (bonne réponse)
  • nest create controller users
  • nest add controller users
  • nest make:controller users
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.

  • npm run start:dev (bonne réponse)
  • npm start
  • nest serve
  • node dist/main.js
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).

  • Le point d'entrée de l'application qui crée et démarre le serveur HTTP (bonne réponse)
  • Le fichier de configuration principal
  • Le module racine
  • Le fichier des routes
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();

  • 3000 (bonne réponse)
  • 8080
  • 4200
  • 5000
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);

  • Un mécanisme de transformation et validation des données avant qu'elles n'atteignent le contrôleur (bonne réponse)
  • Un type de base de données
  • Un composant de logging
  • Une alternative aux contrôleurs
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.

  • Ajouter class-validator et class-transformer, utiliser ValidationPipe global ou local, et ajouter des décorateurs de validation dans le DTO (bonne réponse)
  • C'est automatique sans configuration
  • NestJS n'a pas de validation intégrée
  • Il faut écrire manuellement chaque validation
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; }

  • Un mécanisme qui détermine si une requête doit être traitée par le contrôleur (authentification, autorisation) (bonne réponse)
  • Un pare-feu pour l'API
  • Un type de validation
  • Un service de logging
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.

  • Un mécanisme qui intercepte la requête ou la réponse pour ajouter de la logique (logging, transformation, mise en cache) (bonne réponse)
  • Un type de contrôleur
  • Un service de base de données
  • Un fichier de configuration
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).

  • @HttpCode(201) (bonne réponse)
  • @StatusCode(201)
  • @ResponseStatus(201)
  • @SetStatus(201)
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(); }

  • Utiliser les exceptions intégrées (BadRequestException, NotFoundException, UnauthorizedException) ou créer des exceptions personnalisées héritant de HttpException (bonne réponse)
  • Utiliser throw new Error()
  • Les exceptions sont automatiquement gérées sans intervention
  • Utiliser return { error: "message" }
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); } }

  • Express est le moteur HTTP par défaut, plus populaire ; Fastify est plus performant (plus rapide, moins de consommation mémoire) mais moins d'extensions (bonne réponse)
  • Fastify est le moteur par défaut
  • Express est plus performant que Fastify
  • NestJS ne supporte que Express
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.

  • Utiliser app.use() dans main.ts ou créer une classe avec @Injectable() et configure() (bonne réponse)
  • Ajouter dans le fichier module
  • Utiliser @Middleware()
  • Les middlewares ne sont pas supportés
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.

  • Un fichier pour stocker les variables d'environnement (port, clés API, URLs de base de données) (bonne réponse)
  • Un fichier de configuration TypeScript
  • Un fichier pour les routes
  • Un fichier de logs
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.

  • Injecter ConfigService et utiliser configService.get("PORT")
  • Utiliser process.env.PORT directement
  • Les deux méthodes sont valides (bonne réponse)
  • NestJS ne supporte pas les variables d'environnement
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"); }

  • Définit la durée de vie d'un provider : DEFAULT (singleton), REQUEST (une instance par requête), TRANSIENT (nouvelle instance à chaque injection) (bonne réponse)
  • La portée des variables
  • La configuration des modules
  • Le scope des routes
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.

  • Utiliser forwardRef(() => Type) pour résoudre les références circulaires (bonne réponse)
  • NestJS les gère automatiquement sans configuration
  • Les dépendances circulaires sont interdites
  • Utiliser @LazyInject()
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.

  • Un module qui génère automatiquement la documentation de l'API à partir des décorateurs et des DTOs (bonne réponse)
  • Une base de données
  • Un outil de test
  • Un framework de logging
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().

  • Instancier manuellement le contrôleur avec des mocks des dépendances, ou utiliser Test.createTestingModule() (bonne réponse)
  • Lancer l'application complète
  • NestJS ne supporte pas les tests unitaires
  • Utiliser seulement des tests d'intégration
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();