🎁 Inscrivez-vous et profitez gratuitement de 30 minutes maximum d’IA en ligne. Aucune carte bancaire requise.

Questions et réponses d'entretien Node.js : boucle d'événements, asynchrone, API et mise à l'échelle

September 3, 2026
Questions d'entretien Node.js avec réponses et code sur la boucle d'événements, les modèles asynchrones, Express, les flux, les fuites de mémoire, la sécurité et la mise à l'échelle.
Questions et réponses d'entretien Node.js : boucle d'événements, asynchrone, API et mise à l'échelle
node js interview questions
nodejs interview questions and answers
node event loop interview
express interview questions

Les entretiens Node.js commencent par la boucle d'événements et le code asynchrone, puis abordent les API, la gestion des erreurs, les streams, les performances et la sécurité. La raison la plus fréquente pour laquelle les candidats trébuchent est qu'ils décrivent la boucle d'événements comme de la magie. Une explication claire de ce qui s'exécute où, et de ce qui bloque, voilà ce que les recruteurs écoutent.

Voici 24 questions avec leurs réponses. Les exemples de code sont courts pour que vous puissiez les taper de mémoire.

Boucle d'événements et asynchrone

1. Qu'est-ce que Node.js ?

Un environnement d'exécution JavaScript construit sur le moteur V8 de Chrome qui s'exécute en dehors du navigateur. Il utilise une boucle d'événements mono-thread pour JavaScript avec des E/S non bloquantes, ce qui le rend efficace pour gérer de nombreuses connexions qui passent la plupart de leur temps à attendre.

2. Comment fonctionne la boucle d'événements ?

Le code JavaScript s'exécute sur un seul thread. Lorsqu'il lance une opération d'E/S comme la lecture d'un fichier ou l'envoi d'une requête, Node la délègue au système ou à un pool de threads et continue. Quand l'opération se termine, son callback est mis en file d'attente, et la boucle d'événements l'exécute lorsque la pile d'appels est vide. La boucle traverse plusieurs phases : les timers, les callbacks en attente, le poll (E/S), le check (setImmediate) et les callbacks de fermeture.

3. Quel est l'ordre entre process.nextTick, les Promesses, setTimeout et setImmediate ?

console.log('1 sync');
setTimeout(() => console.log('4 timeout'), 0);
setImmediate(() => console.log('5 immediate'));
Promise.resolve().then(() => console.log('3 promise'));
process.nextTick(() => console.log('2 nextTick'));

Le code synchrone s'exécute en premier. Ensuite les callbacks process.nextTick, puis les microtâches des promesses, puis les phases de la boucle. setTimeout(0) versus setImmediate peut varier dans le module principal, mais à l'intérieur d'un callback d'E/S, setImmediate s'exécute toujours en premier. Soyez prêt à expliquer plutôt qu'à simplement réciter.

4. Que signifie « bloquer la boucle d'événements », et comment l'éviter ?

Une longue tâche synchrone, comme le parsing d'un énorme JSON, une grosse boucle ou un fs.readFileSync dans un handler de requête, bloque toutes les autres requêtes jusqu'à sa fin. Pour l'éviter, utilisez des API asynchrones, découpez le travail en morceaux, ou déplacez le travail gourmand en CPU vers des worker threads ou un autre processus.

5. Callbacks, promesses et async/await : quelles différences ?

Les callbacks sont le style d'origine et peuvent s'imbriquer profondément. Les promesses représentent une valeur future et se chaînent avec then. async/await est une syntaxe au-dessus des promesses qui se lit comme du code synchrone et fonctionne avec try/catch.

6. Comment exécuter des tâches asynchrones en parallèle ?

const [user, orders] = await Promise.all([getUser(id), getOrders(id)]);

Promise.all rejette si l'une échoue. Promise.allSettled attend toutes les promesses et rapporte chaque résultat. Promise.race renvoie la première à se résoudre. N'utilisez pas await dans une boucle quand les appels sont indépendants.

7. Quelle est la différence entre worker threads, processus enfants et cluster ?

Les worker threads exécutent du JavaScript dans des threads séparés au sein d'un même processus et peuvent partager la mémoire, ce qui convient aux tâches gourmandes en CPU. Les processus enfants lancent des programmes séparés. Le module cluster fork plusieurs copies de l'application, une par cœur, en partageant un port, ce qui permet d'utiliser tous les CPU pour traiter les requêtes.

Modules et outillage

8. CommonJS versus modules ES ?

CommonJS utilise require et module.exports et charge de manière synchrone. Les modules ES utilisent import et export, sont le standard en JavaScript et supportent le top-level await. Node supporte les deux, le choix se faisant par l'extension de fichier ou le champ type dans package.json.

9. Que contient package.json, et quelle est la différence entre dependencies et devDependencies ?

Il contient les métadonnées, les scripts et les dépendances. Les dependencies sont nécessaires à l'exécution, et les devDependencies uniquement pour le développement et les tests. Un fichier de lock enregistre les versions exactes pour que les installations soient reproductibles.

10. Comment gérer la configuration d'environnement ?

Utilisez des variables d'environnement, lues via process.env, avec un module de configuration validé. Gardez les secrets hors du dépôt, et utilisez un gestionnaire de secrets en production.

API et Express

11. Qu'est-ce qu'un middleware dans Express ?

Une fonction ayant accès à la requête, à la réponse et à next. Les middlewares s'exécutent dans l'ordre et peuvent modifier la requête, terminer la réponse ou passer le contrôle. Les usages typiques sont le logging, le parsing du corps, l'authentification et la gestion des erreurs.

app.use((req, res, next) => {
  console.log(req.method, req.url);
  next();
});

12. Comment gérer les erreurs dans une application Express ?

Attrapez les erreurs dans les handlers asynchrones et passez-les à next(err), puis utilisez un middleware de gestion d'erreurs à quatre arguments (err, req, res, next) pour envoyer une réponse cohérente. Dans Express 5, les promesses rejetées des handlers sont transmises automatiquement. Pour les exceptions non capturées et les rejets non gérés, loguez et redémarrez le processus plutôt que de continuer dans un état inconnu.

13. Comment concevriez-vous un endpoint d'API REST pour créer une commande ?

Validez l'entrée, authentifiez l'utilisateur, vérifiez les permissions, créez la commande dans une transaction de base de données, renvoyez 201 avec la nouvelle ressource et son emplacement, gérez les doublons avec une clé d'idempotence, et renvoyez des erreurs claires avec les bons codes de statut.

14. Comment authentifier les utilisateurs ?

Des sessions avec cookies, ou des tokens comme les JWT. Hashez les mots de passe avec un algorithme lent comme bcrypt ou argon2. Avec les JWT, gardez une expiration courte, utilisez les refresh tokens avec précaution, et ne stockez pas de données sensibles dans le token.

Streams, fichiers et performance

15. Que sont les streams, et pourquoi les utiliser ?

Les streams traitent les données par blocs au lieu de tout charger en mémoire. Il en existe quatre types : readable, writable, duplex et transform. On les utilise pour les gros fichiers, les uploads et les téléchargements.

const fs = require('node:fs');
const { pipeline } = require('node:stream/promises');
const zlib = require('node:zlib');
await pipeline(fs.createReadStream('in.log'), zlib.createGzip(), fs.createWriteStream('in.log.gz'));

16. Qu'est-ce que la backpressure ?

Quand un stream writable n'arrive pas à suivre le rythme d'un stream readable, il signale à la source de ralentir. pipeline et pipe gèrent cela pour vous. Si vous écrivez manuellement, vérifiez la valeur de retour de write() et attendez l'événement drain.

17. Comment détecter une fuite de mémoire ?

Surveillez la mémoire dans le temps, prenez des snapshots du heap (Chrome DevTools ou --inspect) et comparez-les pour voir quels objets grossissent. Les causes fréquentes sont les caches globaux qui n'expirent jamais, les écouteurs d'événements qui ne sont pas retirés et les closures qui retiennent de gros objets.

18. Comment passer à l'échelle une application Node.js ?

Lancez plusieurs processus avec le module cluster ou un gestionnaire de processus, placez-les derrière un load balancer, gardez l'application sans état en déplaçant les sessions vers Redis ou une base de données, utilisez du cache et scalez horizontalement avec des conteneurs. Déportez le travail gourmand en CPU vers des workers ou des services séparés.

19. Comment profiler un endpoint lent ?

Mesurez d'abord avec des logs et des timings, puis utilisez --prof ou --cpu-prof, ou un outil de flame graph, pour identifier les fonctions coûteuses. Vérifiez les requêtes en base de données, car la lenteur vient plus souvent de là que du JavaScript.

Sécurité et fiabilité

20. Quels sont les problèmes de sécurité courants avec Node.js ?

L'injection (SQL, NoSQL, commande), le cross-site scripting, une authentification faible, des dépendances vulnérables, des secrets dans le code, l'absence de rate limiting et la désérialisation non sécurisée. On s'en protège avec la validation des entrées, des requêtes paramétrées, helmet, des audits de dépendances (npm audit) et le principe du moindre privilège.

21. Comment effectuer un arrêt gracieux ?

Sur SIGTERM, arrêtez d'accepter de nouvelles connexions, laissez les requêtes en cours se terminer, fermez les connexions à la base de données, puis quittez, avec un timeout en dernier recours.

process.on('SIGTERM', () => {
  server.close(() => process.exit(0));
});

22. Comment tester du code Node.js ?

Des tests unitaires avec un runner comme le node:test intégré, Jest ou Vitest, en mockant les appels externes. Des tests d'intégration contre une base de données de test et des tests au niveau HTTP avec un outil comme Supertest. Gardez les tests rapides et indépendants.

Conception et mise en situation

23. Votre API est lente sous charge. Comment enquêtez-vous ?

Consultez les métriques de latence et de CPU. Si le CPU est élevé sur un seul cœur, cherchez du code bloquant ou un traitement JSON lourd. Si le CPU est bas et la latence élevée, regardez du côté de l'attente sur la base de données ou d'autres services. Ajoutez ensuite du cache, des index, du connection pooling ou du batching, puis retestez sous charge.

24. Comment construirais-tu un endpoint d'upload pour de gros fichiers ?

Streamez l'upload directement vers le stockage, par exemple un object storage avec une URL pré-signée, au lieu de le mettre en mémoire tampon. Fixez des limites de taille, validez le type, scannez si nécessaire et traitez ensuite dans un job en arrière-plan.

Comment se préparer

Écrivez une petite API avec authentification, une base de données et une route d'upload, puis profilez-la avec un outil de charge et corrigez un problème. Entraînez-vous à dessiner l'event loop et à expliquer la sortie d'un petit script comme celui ci-dessus. Préparez une histoire réelle de débogage d'un problème de performance ou de fiabilité. Pour les épreuves de code, consultez notre guide de l'assistant d'entretien de codage, et pour la conception, le guide de system design.

Dites vos réponses à voix haute et relisez la transcription pour repérer les endroits où vous avez utilisé un terme sans l'expliquer. Respectez les règles de l'employeur sur les outils d'IA lors de tout entretien en direct.

Entraînez-vous aux réponses d'entretien Node.js avec YesToTheOffer

Passez un entretien technique simulé, expliquez la boucle d'événements à voix haute et consultez votre transcription par la suite. 30 minutes gratuites, sans abonnement.

iOS & Android — Bientôt disponible
Voir les tarifs