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

Entretien Node.js Junior — Express, REST et Middleware

Node-Js Junior Quiz-Nodejs-Junior Express-Js Middleware Api-Rest Nodejs-Routing Questions-Entretien-Nodejs-Junior Qcm-Nodejs-Junior Gestion-Erreurs Backend-Rest Javascript Back-End Rest
Junior 🔀 Mixte 20 questions ⏱ 15 min
📝

Entretien Node.js Junior — Express, REST et Middleware

20 questions Node.js niveau junior : Express.js, middleware, création d'API REST, routing, gestion des erreurs HTTP et bonnes pratiques backend. Parfait pour un entretien Node.js Junior.

20 questions ⏱ ~15 min Niveau Junior

Partager

Banque de révision : les 25 questions corrigées

Voici l'intégralité des 25 questions de « Entretien Node.js Junior — Express, REST et 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.

  • Mono-thread, asynchrone, non-bloquant avec une boucle d'événements (bonne réponse)
  • Multi-thread, synchrone, bloquant
  • Mono-thread, synchrone, bloquant
  • Multi-thread, asynchrone, non-bloquant
Explication : Node.js utilise un seul thread principal avec une boucle d'événements (event loop) pour gérer les opérations asynchrones. Cela permet de traiter des milliers de connexions simultanées sans créer de thread par connexion.
Cette architecture rend Node.js particulièrement adapté aux applications I/O intensives (API, chat, streaming), mais pas aux calculs CPU intensifs.

  • const express = require("express"); const app = express(); app.get("/", (req, res) => res.send("Hello")); app.listen(3000); (bonne réponse)
  • const http = require("http"); http.createServer().listen(3000);
  • express.createServer().listen(3000);
  • new Express().listen(3000);
Explication : Express est le framework web le plus populaire pour Node.js. On instancie l'application avec express(), on définit des routes avec app.get(), app.post(), etc., et on démarre le serveur avec app.listen().
Installez Express avec npm install express. C'est beaucoup plus simple que le module http natif.

  • Envoie une réponse HTTP (texte, JSON, HTML, etc.) au client (bonne réponse)
  • Redirige le client vers une autre URL
  • Définit un cookie
  • Envoie une requête à un autre serveur
Explication : res.send() est une méthode d'Express qui envoie une réponse au client. Elle peut envoyer du texte, du JSON, du HTML, des buffers, etc. Elle définit automatiquement le Content-Type approprié.
Pour envoyer du JSON spécifiquement, utilisez res.json(). Pour un fichier, utilisez res.sendFile().

  • req.query (bonne réponse)
  • req.params
  • req.body
  • req.headers
Explication : req.query contient les paramètres de l'URL après le ?. Exemple : GET /users?page=2&limit=10 donne req.query = { page: "2", limit: "10" }.
Les paramètres d'URL (ex: /users/:id) sont dans req.params. Le corps d'une requête POST/PUT est dans req.body (nécessite un middleware comme express.json()).

  • req.params.id
  • req.query.id
  • req.body.id
  • req.params["id"] (les deux réponses A et D sont correctes) (bonne réponse)
Explication : Les paramètres dynamiques définis avec : dans la route sont accessibles via req.params. Si la route est /users/:id, req.params.id ou req.params["id"] donne la valeur.
Exemple complet : app.get("/users/:id", (req, res) => { const id = req.params.id; });

  • Utiliser app.use(express.json()) puis req.body (bonne réponse)
  • Directement avec req.body (sans configuration)
  • req.data
  • req.content
Explication : Pour parser le JSON du corps d'une requête, vous devez ajouter le middleware express.json(). Ensuite, les données sont disponibles dans req.body. C'est obligatoire car Express ne parse pas le corps par défaut.
Pour les formulaires URL-encodés, utilisez express.urlencoded({ extended: true }).

  • POST (bonne réponse)
  • GET
  • PUT
  • DELETE
Explication : En REST, POST est utilisé pour créer une nouvelle ressource. GET est pour lire, PUT/PATCH pour mettre à jour, DELETE pour supprimer.
Bien que ce soit la convention, ce n'est pas obligatoire. Certaines API utilisent POST pour tout, mais ce n'est pas recommandé.

  • res.status(404).send("Non trouvé")
  • res.sendStatus(404)
  • res.status(404).json({ error: "Not found" })
  • Toutes ces réponses sont correctes (bonne réponse)
Explication : Toutes ces méthodes fonctionnent. res.status(404).send() permet de personnaliser le message. res.sendStatus(404) envoie automatiquement "Not Found". res.status(404).json() envoie du JSON.
res.status() chaîne les méthodes. N'oubliez pas d'appeler send(), json(), ou end() après.

  • Une fonction qui a accès à req, res, et next, pouvant modifier la requête/réponse ou terminer le cycle (bonne réponse)
  • Un type particulier de route
  • Un modèle de base de données
  • Une fonction de logging uniquement
Explication : Un middleware est une fonction qui s'exécute entre la réception de la requête et l'envoi de la réponse. Il peut exécuter du code, modifier req/res, terminer le cycle, ou appeler next() pour passer au middleware suivant.
Exemples : logging, authentification, parsing de corps, compression, gestion CORS.

  • Passe l'exécution au middleware suivant dans la chaîne (bonne réponse)
  • Termine la requête immédiatement
  • Déclenche une erreur
  • Redémarre la chaîne de middlewares
Explication : next() appelle le prochain middleware dans la pile. Sans next(), la requête reste bloquée. Si vous ne voulez pas passer au suivant, vous devez envoyer une réponse (res.send()).
Pour passer une erreur, appelez next(err). Cela déclenche le gestionnaire d'erreurs.

  • app.use(express.static("public")) (bonne réponse)
  • app.static("public")
  • app.serve("public")
  • express.static() ne sert que les fichiers HTML
Explication : Le middleware express.static() sert les fichiers statiques d'un dossier. Exemple : app.use(express.static("public")) rend accessible tous les fichiers du dossier public.
Placez vos fichiers CSS, JS client, images dans le dossier public. Un fichier public/style.css sera accessible à /style.css.

  • Un outil qui redémarre automatiquement l'application Node.js lors des modifications de fichiers (bonne réponse)
  • Un framework de test
  • Un gestionnaire de base de données
  • Un compilateur TypeScript
Explication : Nodemon surveille les fichiers du projet et redémarre automatiquement l'application quand un fichier change. C'est très utile en développement pour ne pas avoir à redémarrer manuellement le serveur.
Installez-le avec npm install -g nodemon ou npm install --save-dev nodemon, puis lancez avec nodemon app.js.

  • npm install --save-dev nom-du-package (bonne réponse)
  • npm install -g nom-du-package
  • npm install --production nom-du-package
  • npm install --dev nom-du-package
Explication : Le flag --save-dev (ou -D) installe le package dans devDependencies de package.json. Ces packages ne sont pas installés en production (NODE_ENV=production).
Exemples de devDependencies : testing (jest, mocha), linting (eslint), compilation (typescript), nodemon.

  • Exécute un script personnalisé défini dans la section "scripts" du package.json (bonne réponse)
  • Installe un package
  • Désinstalle un package
  • Met à jour tous les packages
Explication : npm run nom-script exécute la commande définie dans "scripts": { "nom-script": "commande" } du package.json. Exemples : npm start (raccourci pour npm run start), npm test.
Les scripts npm sont parfaits pour standardiser les commandes d'un projet : build, test, dev, start, lint.

  • PORT=3000 node app.js (Linux/Mac) ; set PORT=3000 && node app.js (Windows)
  • node app.js --port=3000
  • env PORT=3000 node app.js
  • Les deux réponses A et C sont correctes selon l'OS (bonne réponse)
Explication : Sur Linux/Mac : PORT=3000 node app.js. Sur Windows : set PORT=3000 && node app.js. La commande env fonctionne aussi sur Unix. Utilisez cross-env pour une solution multiplateforme.
Pour un projet, utilisez le package dotenv qui charge les variables depuis un fichier .env.

  • process.env.MA_VARIABLE (bonne réponse)
  • env.MA_VARIABLE
  • process.MA_VARIABLE
  • global.MA_VARIABLE
Explication : Les variables d'environnement sont accessibles via l'objet process.env. Exemple : const port = process.env.PORT || 3000; utilise la variable PORT ou 3000 par défaut.
Pensez toujours à fournir des valeurs par défaut pour éviter les erreurs si les variables ne sont pas définies.

  • axios
  • fetch (natif depuis Node 18)
  • request (déprécié)
  • Toutes ces réponses sont correctes selon la version (bonne réponse)
Explication : Historiquement, request était populaire mais déprécié. axios est très utilisé pour ses fonctionnalités avancées. Depuis Node.js 18, fetch est natif (expérimental depuis Node 17).
Pour les nouveaux projets, utilisez fetch (natif) ou axios (plus de fonctionnalités : intercepteurs, annulation).

  • Un fichier qui verrouille les versions exactes des dépendances pour des installations reproductibles (bonne réponse)
  • Un fichier de configuration d'Express
  • Un fichier qui stocke les logs d'installation
  • Un fichier optionnel sans importance
Explication : package-lock.json enregistre les versions exactes de toutes les dépendances et sous-dépendances. Il garantit que npm install installe exactement les mêmes versions sur toutes les machines.
Commitez package-lock.json dans votre dépôt Git. Il assure la reproductibilité des installations.

  • npm uninstall nom-du-package
  • npm remove nom-du-package
  • npm rm nom-du-package
  • Toutes ces commandes fonctionnent (bonne réponse)
Explication : Toutes ces commandes sont des alias : npm uninstall, npm remove, npm rm font la même chose. Elles suppriment le package de node_modules et de package.json.
Ajoutez --save-dev si vous voulez le supprimer des devDependencies, ou -g pour un package global.

  • Utiliser try/catch dans la route et appeler next(err) en cas d'erreur (bonne réponse)
  • Ignorer les erreurs
  • Utiliser res.error()
  • Les erreurs sont automatiquement gérées par Express
Explication : Dans une route asynchrone, utilisez try/catch et appelez next(err) pour passer l'erreur au gestionnaire d'erreurs d'Express. Pour les routes async, utilisez un wrapper comme express-async-errors ou gérez manuellement.
Définissez un middleware d'erreur à la fin : app.use((err, req, res, next) => { res.status(500).send("Erreur"); });

  • Permet les requêtes cross-origin (API appelée depuis un autre domaine) (bonne réponse)
  • Compresse les réponses
  • Sert des fichiers statiques
  • Parse le corps des requêtes
Explication : CORS (Cross-Origin Resource Sharing) est un mécanisme de sécurité. Le middleware cors ajoute les en-têtes nécessaires pour permettre à une API d'être appelée depuis un autre domaine (front-end sur un port différent).
Installez avec npm install cors, puis utilisez app.use(cors()) pour autoriser toutes les origines (développement uniquement).

  • Utiliser le routeur Express : express.Router() pour créer des modules de routes séparés (bonne réponse)
  • Toutes les routes dans app.js
  • Un fichier par méthode HTTP
  • Utiliser des fichiers JSON
Explication : Le express.Router() permet de créer des routeurs modulaires. On définit les routes dans des fichiers séparés (ex: users.js, products.js) et on les monte avec app.use("/users", userRouter).
Structure recommandée : routes/users.js, routes/products.js, controllers/usersController.js, models/User.js.

  • npm update (bonne réponse)
  • npm upgrade
  • npm install --latest
  • npm refresh
Explication : npm update met à jour les packages dans les limites définies par package.json (ex: ^1.2.3 met à jour vers 1.x.x mais pas 2.0.0). Pour mettre à jour vers les dernières majeures, utilisez npm install package@latest ou un outil comme npm-check-updates.
Exécutez npm outdated pour voir quels packages ont des versions plus récentes.

  • Ajouter un gestionnaire pour l'événement "uncaughtException" : process.on("uncaughtException", handler) (bonne réponse)
  • Ignorer les erreurs
  • Utiliser try/catch autour de tout le code
  • C'est impossible
Explication : process.on("uncaughtException") capture les erreurs non gérées. Cependant, après une telle erreur, l'état de l'application est incertain. La meilleure pratique est de logger l'erreur puis de redémarrer le processus (avec un process manager comme PM2).
Utilisez process.on("unhandledRejection") pour les promesses rejetées non gérées.

  • Un process manager pour Node.js qui permet de garder l'application toujours active, de redémarrer après crash, et de faire du load balancing (bonne réponse)
  • Un framework de test
  • Un gestionnaire de base de données
  • Un compilateur TypeScript
Explication : PM2 (Process Manager 2) est un outil de production qui gère les processus Node.js. Il redémarre automatiquement l'application si elle plante, peut exécuter plusieurs instances (cluster mode), gère les logs, et permet des redémarrages sans downtime.
Installez PM2 globalement : npm install -g pm2. Utilisation : pm2 start app.js, pm2 restart app, pm2 logs.