Node.js - Du Javascript coté serveur

Auteur: Mohamed CHINY Durée necessaire pour le cours de Node.js - Du Javascript coté serveur Niveau recommandé pour le cours de Node.js - Du Javascript coté serveur Supports vidéo disponibles pour ce cours Exercices de renforcement non disponibles pour ce cours Quiz non disponibles pour ce cours

Page 5: Récupérer les paramètres d'une requête en Node.js

Toutes les pages

Récupérer les paramètres d'une requête avec le module URL de Node.js

Extraire les valeurs des paramètres d'une URL

Dans la plupart des cas, on souhaite que la réponse qui provient du serveur soit dynamique, c'est à dire qu'elle soit capable de changer automatiquement en fonction de certaines conditions, notamment, selon les paramètres qui ont été passés à travers la requête.

Créons un exemple simple qui permet d'afficher, dans le navigateur, les paramètres passés dans une URL.

Le code que je propose est le suivant:
const http=require("http")

http.createServer((req,res)=>{
   res.write(req.url)
   res.end()
}).listen(8080,()=>{
   console.log("Serveur en écoute...")
})

Il est évident que la paramètres passés en URL font partie de la requête, c'est pour cette raison que l'on a invoqué l'attribut url à travers l'objet req qui représente la requête.
Figurez-vous bien que nous n'avons pas encore inclus le module url qui nous intéresse dans cette section.
Maintenant, appelons notre script en tapant l'URL suivante:
http://localhost:8080/?id=100&nom=Chiny&prenom=Mohamed
Sur le navigateur on verra s'afficher la chaine suivante:
/?id=100&nom=Chiny&prenom=Mohamed
On voit bien que l'on a pu récupérer tous les paramètres passés en URL en guise d'une seule chaine de caractères unique. Si on veut récupérer la valeur du paramètre nom par exemple, on peut envisager l'utilisation des méthodes qui s'appliquent aux tableaux ou aux chaines de caractères comme ceci:
const http=require("http")

http.createServer((req,res)=>{
   str=req.url
   tab=str.split("&")
   nom=tab[1].split("=")
   res.write(nom[1])
   res.end()
}).listen(8080,()=>{
   console.log("Serveur en écoute...")
})
En fait, nous avons stocké la chaine précédente dans la variable str, puis nous l'avons scindé au niveau de l'occurrence &, ce qui va générer un tableau tab qui contient 3 entrées. Nous avons ensuite scindé la deuxième entrée du tableau (qui est sensée contenir le nom) au niveau du symbole =. Cela donnera lieux à un autre tableau nommé nom qui contient deux entrée. En fin, on affiche la deuxième entrée de ce tableau-là et qui est sensé valoir "Chiny".

Sur le navigateur on aura donc:
Chiny
Vous vous rendez-compte que nous avons atteint notre objectif mais après avoir fait un peu de "Gymnastique". Cependant, si la chaîne de l'URL contenait beaucoup de paramètres, alors il serait plus compliqué d'atteindre la bonne valeur en procédant de la sorte. D'où l'utilité du module url.

Utiliser le module URL de Node.js

Le module URL de Node.js permet de scinder une URL de manière automatique pour permettre un accès facile aux différents paramètres qui la constituent. Pour faire simple, on peut dire que le module URL permet de parser (analyser) les URL afin de pouvoir en extraire les informations voulues.

Reprenons l'exemple précédent, mais cette fois, nous allons utiliser le module URL qui sera inclus au même titre que le module http:
const http=require("http")
const url=require("url")

http.createServer((req,res)=>{
   res.write(url.parse(req.url,true).query.nom)
   res.end()
}).listen(8080,()=>{
   console.log("Serveur en écoute...")
})
Nous avons invoqué la méthode parse() de l'objet url. Cette méthode prend en premier argument une chaîne d'URL, l'analyse et renvoie un objet URL constitué des différentes propriétés qui correspondent aux paramètres. Le deuxième argument (true dans ce cas) est un booléen qui indique si la propriété query sera définie sur un objet renvoyé par la méthode parse() du module querystring.

La propriété query est vue comme un objet littéral Javascript dont les propriétés correspondent aux paramètres de l'URL et les valeurs sont les valeurs respectives de ces paramètres-là.

Si on exécute le code précédent on aura le même résultat sur le navigateur:
Chiny

Inclure les valeurs des paramètres URL dans la réponse HTML

Pour rendre notre page HTML (qu'on a vu dans le chapitre précédent) dynamique, nous allons personnaliser le message Bonjour en ajoutant le nom et le prénom que l'on aura récupéré de l'URL.

Reprenons le code HTML de la dernière fois, mais cette fois, nous y intégrerons un marqueur (une sorte de chaine de caractère spéciale) qui sera détectée par notre script pour être remplacée par la chaîne que l'on souhaite. Disons que ce marqueur sera {{NomPrenom}}.

Le code HTML ressemblera à ceci:
<!DOCTYPE html>
<html>
   <head>
      <meta charset="utf-8">
      <title>Node.JS</title>
   </head>
   <body>
      <h1>Bonjour {{NomPrenom}}</h1>
      <p>Page retournée par un serveur <b>Node.js</b></p>
   </body>
</html>

Maintenant, nous allons écrire le code Javacript (Node.js) complet qui importera le fichier HTML afin de l'afficher sur le navigateur en remplaçant le marqueur intégré par le nom et le prénom récupérés depuis l'URL à l'aide de la méthode Javascript replace():
const http=require("http")
const fs=require("fs")
const url=require("url")

http.createServer((req,res)=>{
   fs.readFile("index.html","utf-8",(err,data)=>{
      if(err){
         res.writeHead(404)
         res.write("Page introuvable!")
      }
      else{
         res.writeHead(200,{
            "content-type":"text/html;charset=UTF-8"
         })
         data=data.replace(
            "{{NomPrenom}}",
            url.parse(req.url,true).query.nom+
            " "+
            url.parse(req.url,true).query.prenom
         )
         res.write(data)
      }
      res.end()
   })
}).listen(8080,()=>{
console.log("Serveur en écoute...")
})
Quand on exécute ce lien:
http://localhost:8080/?id=100&nom=Chiny&prenom=Mohamed
on obtient sur le navigateur le rendu suivant:

Bonjour Chiny Mohamed

Page retournée par un serveur Node.js

Parser (analyser) les URL en vidéo