Nestjs
Junior
Quiz-Nestjs-Junior
Nestjs-Middleware
Nestjs-Guards
Nestjs-Intercepteurs
Nestjs-Pipes
Exception-Handling
Questions-Entretien-Nestjs-Junior
Qcm-Nestjs-Junior
Typeorm
Node-Js
Typescript
Back-End
📝
NestJS Junior — Guards & Middleware
20 questions NestJS niveau junior : middleware, guards, intercepteurs, pipes, gestion des exceptions et intégration avec les bases de données. Parfait pour réussir un entretien NestJS Junior.
Banque de révision : les 30 questions corrigées
Voici l'intégralité des 30 questions de « NestJS Junior — Guards & Middleware », 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 organise l'application en modules (
@Module), contrôleurs (@Controller) pour les routes, et services/providers (@Injectable) pour la logique métier. L'injection de dépendances lie le tout de manière découplée.
Cette architecture modulaire rend le code testable, maintenable et évolutive pour des projets backend complexes.
Explication :
Deux approches : 1) Module standard avec
exports: [MonService] qu'on importe dans chaque module qui en a besoin. 2) Module global avec @Global() qui rend ses exports disponibles partout sans import. L'approche standard est préférable par défaut.
Exemple :
@Module({ providers: [MonService], exports: [MonService] }) export class SharedModule {}
Explication :
Toutes ces commandes fonctionnent.
nest generate service users ou sa forme courte nest g s users ou nest g service users créent un service avec son fichier de test, et l'enregistrent dans le module.
Placez le service dans un dossier :
nest g s users/users crée users.service.ts dans un dossier users.
Explication :
Le
ValidationPipe configuré avec whitelist: true (ignore les propriétés non définies dans le DTO), forbidNonWhitelisted: true (rejette les propriétés supplémentaires), transform: true (convertit automatiquement les types).
Activation globale :
app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true }));
Explication :
Les custom providers permettent de définir comment un token est résolu :
useValue (valeur constante), useClass (classe alternative), useFactory (logique de création), useExisting (alias). Utile pour les configurations, mocks en test, ou logique complexe.
Exemple :
{ provide: "CONFIG", useValue: { apiKey: "123" } } puis @Inject("CONFIG") config
Explication :
La méthode
app.enableCors() active CORS avec les options par défaut. On peut passer des options : app.enableCors({ origin: "https://example.com", credentials: true }). NestJS utilise le middleware cors sous-jacent.
Pour le développement,
app.enableCors() sans options autorise toutes les origines. En production, restreignez avec origin.
Explication :
Les deux décorateurs sont identiques et interchangeables.
@Req() est la forme courte, @Request() la forme longue. Ils injectent l'objet natif de la requête (Express ou Fastify selon le moteur).
Préférez les décorateurs spécifiques comme
@Body(), @Param(), @Query() plutôt que @Req() pour un code plus propre.
Explication :
On peut utiliser le décorateur
@Redirect() au-dessus de la méthode, ou appeler res.redirect() en injectant l'objet réponse avec @Res(). Le décorateur est plus déclaratif.
Exemple :
@Get() @Redirect("https://nestjs.com", 301) redirect() { return; }
Explication :
@nestjs/config utilise dotenv sous le capot. Il charge les variables d'environnement depuis .env, permet la validation avec Joi, et fournit ConfigService pour y accéder de manière typée et testable.
Installation :
npm install @nestjs/config. Importez ConfigModule.forRoot() dans AppModule.
Explication :
La méthode
app.setGlobalPrefix("api") ajoute un préfixe à toutes les routes de l'application. Les routes deviennent /api/users, /api/products, etc.
Pour exclure certaines routes, utilisez
app.setGlobalPrefix("api", { exclude: ["health"] }).
Explication :
NestJS 8+ supporte le versioning natif. On active
app.enableVersioning() (type URI, Header, Media Type). Ensuite, @Controller({ version: "1" }) ou @Version("1") sur une méthode.
Stratégies : VERSION_URI (
/v1/users), VERSION_HEADER (en-tête personnalisé), VERSION_MEDIA_TYPE (Accept header).
Explication :
Une dépendance circulaire survient quand ModuleA importe ModuleB et ModuleB importe ModuleA (ou ServiceA injecte ServiceB et ServiceB injecte ServiceA). Solution :
forwardRef(() => ModuleB) dans les imports et @Inject(forwardRef(() => ServiceB)).
Préférez restructurer le code. forwardRef est une solution de dernier recours qui a un léger impact sur les performances.
Explication :
Pour créer une exception personnalisée :
export class ForbiddenException extends HttpException { constructor() { super("Forbidden", HttpStatus.FORBIDDEN); } }. On peut aussi étendre les exceptions intégrées comme NotFoundException.
On peut ajouter des propriétés personnalisées via
super("Message", status, { cause: error }).
Explication :
Les custom decorators permettent de créer ses propres décorateurs de paramètres. Exemple :
@CurrentUser() qui extrait l'utilisateur du token JWT. Utilise createParamDecorator() et ExecutionContext.
Exemple :
export const CurrentUser = createParamDecorator((data, ctx) => { const req = ctx.switchToHttp().getRequest(); return req.user; });
Explication :
NestJS s'intègre nativement avec TypeORM via
@nestjs/typeorm. On configure TypeOrmModule.forRoot() avec les options de connexion, on définit des entités, et on injecte les repositories avec @InjectRepository(Entity).
Installation :
npm install @nestjs/typeorm typeorm pg. TypeORM supporte MySQL, PostgreSQL, SQLite, MongoDB, etc.
Explication :
Le lazy loading permet de charger des modules dynamiquement avec
import(). Utile pour les modules administratifs, les fonctionnalités rarement utilisées, ou les microservices. Réduit le bundle initial et le temps de démarrage.
Exemple :
const module = await import("./admin/admin.module"); const AdminModule = module.AdminModule;
Explication :
NestJS s'intègre avec Passport.js via
@nestjs/passport. On crée une stratégie JWT (extrait le token du header, vérifie la signature), et on utilise @UseGuards(AuthGuard("jwt")) sur les routes protégées.
Installation :
npm install @nestjs/jwt @nestjs/passport passport passport-jwt. Configurez la clé secrète et les options.
Explication :
nest-cli.json configure le comportement de la CLI : sourceRoot (dossier source), compilerOptions (webpack, tsconfig), assets (fichiers à copier dans le build), monorepo (configuration multi-projets).
Généré automatiquement par
nest new. On peut le modifier pour personnaliser les générateurs, les entrées, etc.
Explication :
Deux approches : 1) Implémenter
OnModuleInit ou OnApplicationBootstrap dans un service (exécution garantie après l'injection). 2) Code synchrone dans main.ts avant app.listen() (mais sans accès aux services injectés).
Préférez
OnModuleInit pour les initialisations qui dépendent des services injectés.
Explication :
Les providers Request Scoped (
@Injectable({ scope: Scope.REQUEST })) créent une nouvelle instance par requête. Utile pour stocker des données liées à la requête (utilisateur courant, tenant ID). Attention : impact sur les performances.
À utiliser avec parcimonie. Préférez passer l'utilisateur via les paramètres de méthode plutôt que via l'état du service.
Explication :
NestJS a une excellente intégration Swagger :
@nestjs/swagger analyse les contrôleurs et DTOs. On ajoute des décorateurs @ApiProperty() dans les DTOs, @ApiOperation() sur les méthodes, et on configure SwaggerModule.setup() dans main.ts.
La documentation générée est accessible sur
/api (par défaut). Les décorateurs améliorent la lisibilité.
Explication :
NestJS fournit plusieurs hooks de cycle de vie :
OnModuleInit, OnModuleDestroy, OnApplicationBootstrap, OnApplicationShutdown, BeforeApplicationShutdown. Utiles pour initialiser des connexions, nettoyer des ressources, etc.
Pour le shutdown, l'application doit avoir été créée avec
app.enableShutdownHooks() pour écouter les signaux SIGTERM/SIGINT.
Explication :
Avec Express :
app.useStaticAssets(join(__dirname, "..", "public")). Avec Fastify : app.register(require("@fastify/static"), { root: publicDir }). Les fichiers sont accessibles directement.
Placez les fichiers statiques dans un dossier
public à la racine du projet. En production, utilisez un reverse proxy (Nginx).
Explication :
Un custom pipe implémente
PipeTransform et sa méthode transform(value, metadata). Il peut transformer la valeur (ex: string en number) ou valider (lancer BadRequestException).
Exemple :
@Injectable() class ParseIntPipe implements PipeTransform { transform(value: string) { const val = parseInt(value); if (isNaN(val)) throw new BadRequestException(); return val; } }
Explication :
NestJS utilise
@nestjs/testing pour créer une application de test, et supertest pour envoyer des requêtes HTTP. On peut utiliser la base de données réelle ou un conteneur Docker.
Exemple :
const app = await Test.createTestingModule({ imports: [AppModule] }).compile(); const request = supertest(app.getHttpServer());
Explication :
Les exception filters interceptent les exceptions non capturées. Un custom filter implémente
ExceptionFilter. On l'applique globalement avec app.useGlobalFilters(new MyFilter()) ou localement avec @UseFilters().
Utile pour formater les erreurs, logger, ou envoyer des réponses personnalisées (ex: format standard d'API).
Explication :
TypeORM supporte plusieurs connexions. Dans NestJS, on utilise
TypeOrmModule.forRoot({ name: "db1", ... }) et TypeOrmModule.forRoot({ name: "db2", ... }). Pour injecter un repository : @InjectRepository(Entity, "db1").
Utile pour la séparation lecture/écriture, ou pour connecter plusieurs bases (utilisateurs, produits, logs).
Explication :
Les custom decorators peuvent utiliser
Reflector pour accéder aux métadonnées. Exemple : @Roles("admin") définit des métadonnées, un guard peut les lire avec reflector.get("roles", context.getHandler()).
Pattern courant : décorateur @Roles() pour la sécurité basée sur les rôles, combiné avec un guard AuthGuard.
Explication :
En production : 1)
npm run build compile dans dist/. 2) pm2 start dist/main.js démarre avec PM2 (process manager). PM2 gère les redémarrages, les logs, le clustering.
Utilisez
pm2 ecosystem.config.js pour configurer les variables d'environnement, le nombre d'instances (cluster), et les scripts de démarrage.
Explication :
@nestjs/mongoose permet d'intégrer MongoDB avec Mongoose. On utilise MongooseModule.forRoot() pour la connexion, @Schema() et @Prop() pour les schémas, et @InjectModel() pour injecter les modèles.
Installation :
npm install @nestjs/mongoose mongoose. Alternative à TypeORM pour MongoDB (TypeORM supporte aussi MongoDB mais Mongoose est plus mature).