Skip to content

Index des situations ​

Partez de ce que vous devez faire : chaque ligne donne la réponse courte et mène à l'explication et au code de TaskFlow. Pour un mot-clé précis (un décorateur, un message d'erreur), utilisez aussi la recherche en haut de page.

Démarrer un projet et comprendre l'exécution ​

Vous devez…Réponse courteOù
Créer un projet Nest avec Jest, comme dans le plannest new dans un terminal, choisir CommonJS + Jest (ESM + Vitest est le défaut, et le seul résultat sans terminal interactif)J1 · Générer le projet, questions du CLI
Comprendre pourquoi une requête lente bloque toutes les autresUn seul thread JavaScript : tout calcul synchrone bloque l'event loopEvent loop vs thread-per-request
Exécuter un calcul CPU lourd sans bloquer l'APIworker_threads ou une file de jobsCalcul CPU
Lancer plusieurs appels I/O en parallèlePromise.all, pas une boucle d'awaitPromise et async/await
Démarrer PostgreSQL et Adminer en localdocker compose up -dDocker Compose
Ajouter un module, un contrôleur ou une ressource complètenest g module, nest g controller, nest g service, nest g resourceNest CLI, schematics
Générer un CRUD complet sans répondre aux questionsnest g resource orders --type rest --crudRessource CRUD
Retrouver l'alias d'un schematic (guard, interceptor…)gu, itc, pi, f, mi… ; nest g --helpSchematics et alias
Voir ce qu'une commande va créer avant de l'exécuter-d (--dry-run)Options de génération
Comprendre pourquoi un guard généré ne s'applique pasGuards, pipes, filters, interceptors et middlewares ne sont pas déclarés : branchez-lesSchematics et alias
Partager du code entre plusieurs applicationsnest g app, nest g lib (le projet devient un monorepo)Monorepo
Mettre à jour NestJS d'une version majeurenest info, puis nest upgrade -dAjouter et mettre à jour
Retrouver où se trouve quoi dans le projetUn module par domaine, dto/ et entities/ par moduleStructure du repo

Routes, requêtes et réponses ​

Vous devez…Réponse courteOù
Renvoyer 204 sur un DELETE, 200 sur une action POST@HttpCode(HttpStatus.NO_CONTENT) / @HttpCode(HttpStatus.OK)Codes de statut
Préfixer toutes les routes par /v1app.enableVersioning({ type: VersioningType.URI, defaultVersion: '1' })Versioning
Garder /health hors du versioning@Controller({ path: 'health', version: VERSION_NEUTRAL })Health checks
Lire un paramètre de chemin UUID et refuser le reste@Param('id', ParseUUIDPipe) → 400 si invalidePipes
Filtrer par une valeur d'enum en query@Query('status', new ParseEnumPipe(TaskStatus, { optional: true }))Pipes
Paginer une listePaginationQueryDto (page, limit) + findAndCount / getManyAndCountPagination, recherche
Récupérer l'utilisateur connecté dans un handler@CurrentUser() user: AuthUser@CurrentUser()
Fixer un en-tête de réponse sans perdre la sérialisation@Header() ou un intercepteur, pas @Res()@Res() dans un contrôleur

Valider et transformer les entrées ​

Vous devez…Réponse courteOù
Valider un corps JSONDTO classe + décorateurs class-validator + ValidationPipe globalDTO et validation
Refuser les champs inconnuswhitelist: true, forbidNonWhitelisted: trueValidationPipe global
Écrire le DTO de mise à jour sans dupliquerPartialType(CreateXDto), PickType, OmitTypeMapped types
Recevoir un nombre ou un booléen en query string@Type(() => Number), @Transform pour les booléens, transform: truePagination et filtre
Comprendre pourquoi un type TypeScript ne protège rienLes types sont effacés à l'exécutionValidation à l'exécution
Écrire un pipe de conversion maisonPipeTransformPipes

Injection de dépendances et modules ​

Vous devez…Réponse courteOù
Injecter une interfaceUn token (Symbol) + @Inject(TOKEN) + provider useClass / useFactoryTokens, ProjectsStore
Choisir une implémentation selon la configurationProvider useFactory avec inject: [ConfigService, …]ProjectsStore
Utiliser un service d'un autre moduleLe module source l'ajoute à exports, le vôtre l'importeModules
Corriger « Nest can't resolve dependencies of … »Provider non déclaré, non exporté, ou type de paramètre effacéRésolution, design:type
Configurer un module à partir d'un autre providerforRootAsync / registerAsync avec inject + useFactoryModules dynamiques
Injecter une valeur qui n'est pas une classe (horloge, constante){ provide: CLOCK, useValue: … } + @Inject(CLOCK)CommonModule
Charger un module seulement si une variable existeConditionalModule.registerWhen(Module, (env) => …) avec une fonctionConditionalModule
Casser une dépendance circulaireRevoir le découpage ; forwardRef() en dernier recoursforwardRef
Garder un état par requêteJamais dans un singleton ; scope REQUEST en connaissant son coûtScopes, état dans un singleton

Base de données et TypeORM ​

Vous devez…Réponse courteOù
Brancher PostgreSQLTypeOrmModule.forRootAsync + forFeature([Entity]) par module@nestjs/typeorm
Déclarer une entité avec UUID et dates timestamptz@PrimaryGeneratedColumn('uuid'), @CreateDateColumn({ type: 'timestamptz' })L'entité Project
Remplacer un findByNameContainingfind({ where: { name: ILike('%…%') } }) ou un QueryBuilderRecherche
Écrire une requête avec jointurecreateQueryBuilder().innerJoin(…)QueryBuilder
Supprimer sans perdre la ligne@DeleteDateColumn + softDelete()Repository
Lier deux entités@ManyToOne + @JoinColumn, colonne de clé étrangère expliciteRelations, Task
Éviter le N+1relations ou leftJoinAndSelectN+1
Faire plusieurs écritures en tout-ou-riendataSource.transaction(async (manager) => …), tout passe par managerTransactions, archiver un projet
Contrôler finement une transactionQueryRunnerQueryRunner
Faire évoluer le schémamigration:generate → relire → migration:run ; jamais synchronize en productionMigrations, synchronize
Appliquer les migrations dans l'image Dockernpm run migration:run:prod, étape séparée du démarrageDocker
Remplir une base de développementnpm run seedSeed

Erreurs, logs et pipeline de requête ​

Vous devez…Réponse courteOù
Savoir dans quel ordre s'exécutent middleware, guards, pipes…Middleware → Guards → Interceptors → Pipes → Handler → Interceptors → FiltersOrdre d'exécution
Uniformiser toutes les réponses d'erreurUn ExceptionFilter global (APP_FILTER)AllExceptionsFilter
Renvoyer 409 sur un doublon en baseCode PostgreSQL 23505 → CONFLICT dans le filtreErreurs TypeORM
Renvoyer 404 sur une ressource absentethrow new NotFoundException()Exceptions HTTP
Mesurer la durée de chaque requêteUn NestInterceptor avec tap RxJSLoggingInterceptor
Suivre une requête dans tous les logsEn-tête x-correlation-id + genReqId de nestjs-pinoCorrélation, logs JSON
Ne jamais exposer une stack trace ou du SQLLe filtre renvoie un 500 générique et logue le détailFiltre global
Repérer un await oubliéRègle no-floating-promises (oxlint dans le starter Nest 12)await oublié

Configuration et cycle de vie ​

Vous devez…Réponse courteOù
Avoir un fichier de config par environnementNODE_ENV + .env.development, .env.test ; seul .env.example est versionnéProfils, fichiers .env
Refuser de démarrer avec une configuration invalideConfigModule.forRoot({ validate })Validation de l'environnement
Injecter une configuration typéeregisterAs('database', …) + @Inject(databaseConfig.KEY)Configuration typée
Comprendre pourquoi PORT reste une chaîneÉcrire le type : PORT: number = 3000Métadonnées de type
Exécuter du code au démarrage ou à l'arrêtOnModuleInit, OnApplicationShutdown + enableShutdownHooks()Cycle de vie
Produire des logs JSON en productionnestjs-pino, pino-pretty seulement en développementLogging

Sécurité ​

Vous devez…Réponse courteOù
Protéger toutes les routes par défautJwtAuthGuard global (APP_GUARD)Guard global
Ouvrir une route sans token@Public() lu par le guard via ReflectorRoutes publiques
Réserver une route aux admins@Roles(Role.Admin) + RolesGuard → 403RBAC
Stocker un mot de passeargon2id (argon2.hash, argon2.verify)Hash de mot de passe
Ne pas renvoyer passwordHash@Exclude() + ClassSerializerInterceptor (et @ApiHideProperty() pour la doc)Entités brutes
Ne montrer à un utilisateur que ses projetsFiltre par appartenance ; 404 (et non 403) pour les autresUn utilisateur ne voit que ses projets
Limiter les tentatives de connexion@Throttle({ default: { limit: 5, ttl: 60_000 } }) → 429Sécurité
Ajouter les en-têtes de sécurité et régler CORShelmet(), enableCors({ origin })Sécurité
Prolonger une session sans redemander le mot de passeRefresh token (non implémenté dans TaskFlow)Refresh token

Événements, tâches planifiées, files ​

Vous devez…Réponse courteOù
Réagir à un changement sans coupler les servicesEventEmitter2.emit() + @OnEvent()Événement task.status.changed
Empêcher l'erreur d'un listener d'être perduetry/catch + log dans le listenerErreurs asynchrones
Lancer un traitement chaque nuit@Cron(CronExpression.EVERY_DAY_AT_1AM, { timeZone })Cron OVERDUE
Calculer « aujourd'hui » dans le bon fuseauDate calendaire de Paris, pas toISOString() (UTC)Cron OVERDUE, OVERDUE
Rejouer un traitement qui échoue, avec délaiBullMQ : attempts + backoff exponentielFile BullMQ
Faire tourner BullMQ 6Installer ioredis explicitementBullMQ sans ioredis

Tests ​

Vous devez…Réponse courteOù
Tester un service avec ses dépendances simuléesTest.createTestingModule + { provide: X, useValue: mock }Testing module
Simuler un repository TypeORM{ provide: getRepositoryToken(Task), useValue: … }Mocker un repository
Tester l'API de bout en boutAppModule + supertest + vraie base PostgreSQLParcours e2e
Isoler la base de testService db-test (tmpfs) ou TestcontainersBase de test
Faire échouer la CI sous un seuil de couverturecoverageThreshold dans jest.config.tsSeuil de couverture
Corriger « Reflect.getMetadata is not a function » en testimport 'reflect-metadata'reflect-metadata
Rendre une date « aujourd'hui » testableInjecter une horloge (CLOCK)Tests unitaires

Documentation et mise en production ​

Vous devez…Réponse courteOù
Documenter l'API sans annoter chaque champPlugin CLI @nestjs/swagger dans nest-cli.json, fichiers *.dto.tsSwagger
Exposer liveness et readinessTerminus : /health/live sans dépendance, /health/ready avec la baseHealth checks
Construire une image légère et non rootDockerfile multi-stage, npm ci --omit=dev, USER nodeDockerfile
Lancer l'API conteneurisée en localProfil Compose app après les migrationsProfils Compose
Vérifier chaque branche en CIJob lint-and-build, tests unitaires, e2e avec un service PostgreSQLPipeline GitLab
Finir le parcours proprementRelire LEARNINGS.md, compléter le READMERevue finale