Routage avec Express.js
Les routes dynamiques
On a vue qu'on pouvait ajouter des paramètres à l'url en utilisant le caractère ? suivi du nom du paramète et de sa valeur.
http://localhost:3000/professeurs?code=1
On peut aussi ajouter la valeur du paramètre directement dans l'url sans le nommer, c'est ce qu'on appelle une route dynamique.
http://localhost:3000/professeurs/1
Dans cet exemple on pourra récupérer la valeur 1 dans l'url comme étant un paramètre. Les deux méthodes se valent bien que je trouve celle-ci plus "propre" quand la situation le permet.
Dans le code, quand on déclare la route on va ajouter le nom du paramètre précédé du caractère :. Ensuite le paramètre sera stocké dans l'objet req.params
et portera le nom défini dans la route.
app.get('/professeurs/:code', (req, res) => {
const code = req.params.code;
res.send(`Vous avez demandé le professeur avec le code ${code}`);
});
Si on veut utiliser deux paramètres de cette façon, on doit les séparer par un /.
http://localhost:3000/professeurs/1/mathieu
app.get('/professeurs/:code/:nom', (req, res) => {
const params = req.params;
res.send(`Vous avez demandé le professeur avec le code ${params.code} et le nom ${params.nom}`);
});
Danger
Faites attention à l'ordre des routes dynamiques si la syntaxe de plusieurs routes se ressemble.
Par exemple j'ai ces deux routes qui fonctionnent correctement
app.get('/professeurs/tous', (req, res) => {
const code = req.params.code;
res.send(`Vous avez demandé tous les professeurs.`);
});
app.get('/professeurs/:code', (req, res) => {
const code = req.params.code;
res.send(`Vous avez demandé le professeur avec le code ${code}`);
});
Par contre si j'inverse les routes et que la première est la route avec le paramètre code, on ne pourra jamais accéder à la route /professeurs/tous
car "tous" sera considérer comme une valeur donnée au paramètre :code.
Le routage
Le module Router permet de regrouper plusieurs routes similaire. C'est une très bonne pratique pour maintenir un code clair et consistant qu'on pourra faire évoluer facilement.
Reprenons l'exemple de mes deux routes professeurs plus haut. On doit premièrement créer un fichier qui va contenir toutes ces routes similaires. Ensuite dans ce fichier on importe le module Express et crée un objet Router. Au lieu de définir les routes avec app on va utiliser l'objet Router qu'on vient de créer. Finalement à la fin du fichier on va exporter le module pour pouvoir l'utiliser dans notre fichier index.js
Vous avez remarqué que j'ai enlevé /professeurs
de mes routes? On va gérer cette partie de la route dans le fichier index.js. La seule modification qu'on va faire à ce fichier est d'ajouter ces deux lignes dans la section où l'on ajoute les intergiciels.
Toutes les routes qui débute par /api/professeurs
seront dirigées vers le fichier ./professeurs.route.js (L'ajout de api dans la route est purement esthétique). Donc maintenant quand le serveur recevra par exemple la route /api/professeurs/tous
il va diriger la requète dans le fichier professeurs.route.js pour trouver quoi faire avec la route /tous
.
Avec Router on peut organiser notre projet de plusieurs façon. Nous verrons plus tard des exemples de bonnes structures à adopter pour nos api.
Manuel