Leçon 5 / 15

Relier les routes aux contrôleurs

20 min Node.js — API Express et code asynchrone Gratuit

Objectif : Déclarer les routes des commandes et des produits dans des routeurs Express dédiés et les relier aux contrôleurs correspondants.

Quand toutes les routes sont écrites dans serveur.js, les chemins et les traitements se retrouvent mélangés. Vous allez déplacer la déclaration des routes dans un fichier par ressource, puis connecter chaque chemin à une fonction exportée par son contrôleur.

Le contrat des URL et des réponses a été défini dans les leçons précédentes. Ici, vous ne modifiez pas ce contrat : vous déplacez les déclarations dans les fichiers déjà créés pour les commandes et les produits.

Créer un routeur par ressource

express.Router() crée un objet qui porte des routes indépendamment de l’application principale. Chaque module de route importe le contrôleur de sa ressource, associe une méthode HTTP et un chemin à une fonction, puis exporte son routeur. Le préfixe commun, comme /api/commandes, sera ajouté au moment où le serveur monte le routeur.

routes/commandes.jsJavaScript
const express = require('express');
const commandes = require('../controleurs/commandes');

const router = express.Router();

router.get('/', commandes.lister);
router.get('/:id', commandes.obtenir);
router.post('/', commandes.creer);

module.exports = router;
Aperçu du rendu
Chargement de l'aperçu…

Dans ce routeur, / correspond à la collection et /:id à un élément de la collection. Comme le routeur sera monté sous /api/commandes, ces chemins donneront respectivement GET /api/commandes, GET /api/commandes/:id et POST /api/commandes. Les routes de produits suivent le même principe.

routes/produits.jsJavaScript
const express = require('express');
const produits = require('../controleurs/produits');

const router = express.Router();

router.get('/', produits.lister);

module.exports = router;
Aperçu du rendu
Chargement de l'aperçu…

Fournir les fonctions appelées par les routes

Les contrôleurs existants exportaient un objet vide ; les routes ne pourraient donc pas y trouver les fonctions référencées. Remplacez leur contenu par les fonctions ci-dessous. Les réponses vides conservent la forme JSON normalisée, et la création renvoie le statut 201 prévu pour une ressource créée.

controleurs/commandes.jsJavaScript
function lister(req, res) {
  res.json({
    donnees: [],
    erreur: null
  });
}

function obtenir(req, res) {
  res.json({
    donnees: null,
    erreur: null
  });
}

function creer(req, res) {
  res.status(201).json({
    donnees: {
      id: 1,
      statut: 'en-attente'
    },
    erreur: null
  });
}

module.exports = {
  lister,
  obtenir,
  creer
};
Aperçu du rendu
Chargement de l'aperçu…
controleurs/produits.jsJavaScript
function lister(req, res) {
  res.json({
    donnees: [],
    erreur: null
  });
}

module.exports = {
  lister
};
Aperçu du rendu
Chargement de l'aperçu…

Monter les routeurs dans le serveur

Dans serveur.js, importez les deux modules, puis utilisez app.use() avec leur préfixe. Express combine ce préfixe avec les chemins déclarés dans chaque routeur. Supprimez les routes provisoires /api/commandes, /api/commandes/:id et /api/produits de l’application : elles sont désormais déclarées dans les fichiers dédiés.

serveur.jsJavaScript
const express = require('express');
const commandesRoutes = require('./routes/commandes');
const produitsRoutes = require('./routes/produits');

const app = express();
const port = process.env.PORT || 3000;

app.use(express.json());

app.get('/controle', (req, res) => {
  res.json({
    donnees: { serveur: 'actif' },
    erreur: null
  });
});

app.use('/api/commandes', commandesRoutes);
app.use('/api/produits', produitsRoutes);

app.listen(port, () => {
  console.log(`API démarrée sur le port ${port}`);
});
Aperçu du rendu
Chargement de l'aperçu…

L’ordre de montage est important : Express parcourt les traitements dans l’ordre où ils sont enregistrés. La route de contrôle reste disponible, tandis que les deux préfixes dirigent désormais les requêtes vers leurs routeurs respectifs. Le port et le middleware JSON conservent le fonctionnement établi précédemment.

Vérifier le routage

Démarrez le serveur avec la commande habituelle de votre projet, puis interrogez les URL avec un client HTTP. Vous devez obtenir une liste vide pour les deux collections, une réponse de commande provisoire pour son identifiant et une réponse de création avec le statut 201. Ces résultats confirment que le préfixe du serveur et le chemin du routeur sont bien assemblés.

Exemples de requêtesTexte
GET http://localhost:3000/api/commandes
GET http://localhost:3000/api/commandes/1
GET http://localhost:3000/api/produits
POST http://localhost:3000/api/commandes
Content-Type: application/json

{}
Résultat attendu
GET /api/commandes → 200 : {"donnees":[],"erreur":null}
GET /api/commandes/1 → 200 : {"donnees":null,"erreur":null}
GET /api/produits → 200 : {"donnees":[],"erreur":null}
POST /api/commandes → 201 : {"donnees":{"id":1,"statut":"en-attente"},"erreur":null}

À retenir

  • Chaque ressource possède un routeur dédié qui déclare ses chemins et ses méthodes HTTP.
  • Les fonctions passées à router.get() ou router.post() sont importées depuis le contrôleur correspondant.
  • app.use() monte un routeur sous un préfixe ; Express combine ce préfixe avec son chemin relatif.
  • Les contrôleurs fournis ici sont provisoires : ils seront reliés à la logique métier et aux services dans les prochaines leçons.

Dans la prochaine leçon, vous séparerez plus précisément le traitement des requêtes et la logique d’accès aux données en déléguant celle-ci aux services.

Envie d'aller plus loin ?

Les cours Enovatic sont gratuits et le resteront. Si vous cherchez un accompagnement encadré, nos formations professionnelles sont animées par les mêmes formateurs.