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 3: Créer un serveur HTTP, écouter les requêtes et envoyer une réponse

Toutes les pages

Node.js - Du Javascript coté serveur

Je rappelle qu'en Node.js, on est amené à développer les différents aspects du serveur Web comme l'écoute et la gestion des requêtes, l'envoi des entêtes, la création du rendu, alors que ces différents aspects sont gérés automatiquement par les serveurs Web comme Apache ou Nginx. Cependant, nous allons voir, dans les chapitres qui vont suivre, comment simplifier ces opérations à l'aide du framework Express.js.

Créer un serveur HTTP avec Node.js et commencer le processus requête/réponse

Créer le serveur HTTP et spécifier le port d'écoute

Nous allons commencer par créer un fichier Javascript nommé server.js et qui sera exécuté dans l'environnement Node.js. Ce fichier-là contiendra le code qui permettra de créer le serveur HTTP, écouter les requêtes du client et envoyer une réponse au navigateur.

Veuillez prendre le soin d'inclure le fichier server.js dans un dossier de votre choix pour mieux organiser votre projet. Vous pourrez le renommer comme vous voulez. En effet, le nom server.js n'est qu'une convention au coté du nom app.js qui est aussi souvent utilisé dans ce contexte.

Node.js embarque automatiquement le module nommée HTTP qui permet de monter un serveur Web. Donc, avant toute chose, il faut inclure ce module dans le fichier créé comme ceci:
const http=require("http")
A la place de const on peut mettre var ou let.
La prochaine étape consiste à créer le serveur HTTP et commencer l'écoute des requêtes. Le code ressemblera à ceci:
const http=require("http")

server=http.createServer()
server.listen(8080)
Les points-virgules à la fin de chaque instruction sont facultatifs en Node.js (du moment où chaque instruction est écrite dans une ligne à part).
Pour exécuter ce fichier, nous allons procéder comme on l'a vu dans le chapitre précédent à travers la ligne de commande:
node server.js
Vous allez constater que le terminal reste figé dans cette commande, ce qui veut dire qu'il est entrain d'attendre les requêtes du client.

Maintenant, rendez-vous dans votre navigateur préféré et tapez l'URL suivante:
http://localhost:8080
N'oubliez pas d'expliciter le port d'écoute spécifié dans le code (8080 dans ce cas).
Vous constatez que le navigateur continue à tourner, ce qui est normal, car aucune indication sur la fin du processus de réponse n'a été envoyée par le serveur.

Intercepter la requête et envoyer une réponse au client

Afin d'intercepter la requête du client, on guette l'événement request à travers le gestionnaire d'événements server.on comme ceci:
const http=require("http")

server=http.createServer()
server.on("request",(req,res)=>{
   
})
server.listen(8080)
Le mot-clé on indique que le moteur (environnent d'exécution) Javascript attend le déclenchement de l'événement request (qui signifie qu'une requête vient d'être envoyée par le client) afin d'exécuter la fonction de rappel passée en guise du deuxième augment. Cela nous rappelle le gestionnaire d'événement addEventListener() qui a la même forme.

À la fonction de rappel (que j'ai déclarée sous forme de fonction fléchée), nous avons passé deux arguments req et res qui font respectivement allusion à la requête et la réponse. Ce sont deux objets qui seront sollicités plus tard à travers leurs attributs et méthodes.

Avant de réexécuter le lien http://localhost:8080, il faut redemander le serveur à travers la ligne de commande. En effet, à chaque changement dans le fichier server.js, il faut relancer la commande node server.js pour redémarrer le serveur.
Le fait de devoir redémarrer le serveur à chaque modification du script est certainement fastidieux comme opération. Heureusement, il existe des moyens qui permettent de traquer tout changement de code pour redémarrer automatiquement le serveur. Il s'agit d'une technique que nous allons traiter plus loin dans ce cours.
Là encore, le navigateur tourne en continu car aucune indication de fin de processus n'a été envoyée par le serveur.

Maintenant, il est temps d'envoyer une réponse au client à l'aide des méthodes write() et end(). Le code que je propose ressemblera à ceci:
const http=require("http")

server=http.createServer()
server.on("request",(req,res)=>{
   res.write("Réponse envoyée au client")
   res.end()
})
server.listen(8080)
Les fonctions write() et end() sont des méthodes de l'objet res passé en guise de deuxième argument à la fonction fléchée du gestionnaire d’événement. La méthode write() permet d'envoyer un contenu texte au navigateur afin de l'imprimer sur la page, alors que la méthode end() met fin au processus de réponse.

On réexécute la page sur le navigateur (n’oubliez pas de redémarrer le serveur avant), et là, le navigateur ne mouline plus car il a bien reçu la fin du processus de réponse du serveur à travers la méthode end(). On aura sur le navigateur le résultat suivant:
Réponse envoyée au client
Vous avez certainement constaté que les caractères accentués ne sont pas affichés correctement, ce qui signifie qu'il y a eu un problème d'encodage. En effet, l'encodage doit être envoyé à travers un entête HTTP depuis le serveur. Cependant, comme je l'ai mentionné avant, les entêtes ne sont pas envoyées automatiquement par Node.js, mais c'est plutôt nous qui devrons le faire à travers des instructions explicites.

Avant d'aller plus loin, notez qu'il est possible d'envoyer du contenu à afficher à travers la méthode end() comme ceci:
const http=require("http")

server=http.createServer()
server.on("request",(req,res)=>{
   res.end("Réponse envoyée au client")
})
server.listen(8080)
Cela rend le code un peu moins volumineux.

On peut encore réduire le code comme ceci:
const http=require("http")

http.createServer((req,res)=>{
   res.end("Réponse envoyée au client")
}).listen(8080)
En effet, nous avons directement passé la fonction de rappel à la méthode createServer à laquelle nous avons chaîné la méthode listen(), ce qui rend le code beaucoup plus optimisé.

Il est également possible d'imprimer un message à la console suite au lancement du serveur afin d'indiquer que celui-ci est entrain d'écouter les requête. Pour cela, on passe à la méthode listen() un deuxième argument qui est une fonction de rappelle qui se chargera d'afficher le message voulu comme ceci:
const http=require("http")

http.createServer((req,res)=>{
   res.end("Réponse envoyée au client")
}).listen(8080,()=>{
   console.log("Serveur en écoute...")
})
Désormais, à chaque fois que le serveur redemarre, le message "Serveur en écoute..." sera affichée à la console.
Figurez-vous bien que la console dans ce cas n'est pas celle embarquée au navigateur, mais c'est au niveau de la lingue de commande du serveur.

Créer un serveur HTTP et écouter les requêtes en vidéo