Node JS ous avons créé notre première vraie application avec son serveur web em
Node JS ous avons créé notre première vraie application avec son serveur web embarqué. Mais l'application est pour l'instant minimaliste : Le message renvoyé est du texte brut, il ne comporte même pas de HTML ! L'application renvoie toujours le même message, quelle que soit la page appelée (http://localhost:8080, http://localhost:8080/mapage, http://localhost:8080/dossier/autrepage) Pour que ce chapitre soit complet, nous allons voir comment remédier à ces deux problèmes. Commençons ici par voir comment faire pour renvoyer du HTML. Comme je vous l'ai dit, il y a des règles à respecter entre le client et le serveur. Ils communiquent en se basant sur la norme HTTP inventée par Tim Berners-Lee. Cette norme est à la base du Web (tout comme le langage HTML qui a aussi été inventé par ce même monsieur ). Que dit la norme HTTP ? Que le serveur doit indiquer le type de données qu'il s'apprête à envoyer au client. Eh oui, un serveur peut renvoyer différents types de données : Du texte brut : text/plain Du HTML : text/html Du CSS : text/css Une image JPEG : image/jpeg Une vidéo MPEG4 : video/mp4 Un fichier ZIP : application/zip etc. Ce sont ce qu'on appelle les types MIME. Ils sont envoyés dans l'en-tête de la réponse du serveur. Vous vous souvenez comment on écrit dans l'en-tête de la réponse avec Node.js ? Nous avions écrit ceci : var http = require('http'); var server = http.createServer(function(req, res) { res.writeHead(200, {"Content-Type": "text/html"}); res.end('<p>Voici un paragraphe <strong>HTML</strong> !</p>'); }); server.listen(8080); Jusqu'ici, nous avions toujours écrit le code HTML dans res.end(). Pour mieux découper le code, à partir de maintenant j'utilise la commande res.write()qui permet d'écrire la réponse en plusieurs temps. Ca revient au même, mais notre code est mieux découplé comme ça. res.end()doit toujours être appelé en dernier pour terminer la réponse et faire en sorte que le serveur envoie le résultat au client : var http = require('http'); var server = http.createServer(function(req, res) { res.writeHead(200, {"Content-Type": "text/html"}); res.write('<!DOCTYPE html>'+ '<html>'+ ' <head>'+ ' <meta charset="utf-8" />'+ ' <title>Ma page Node.js !</title>'+ ' </head>'+ ' <body>'+ ' <p>Voici un paragraphe <strong>HTML</strong> !</p>'+ ' </body>'+ '</html>'); res.end(); }); server.listen(8080); Il existe des moyens de séparer le code HTML du code JavaScript : ce sont les systèmes de templates. C'est un peu hors sujet pour le moment, étant donné qu'on commence tout juste à découvrir les bases de Node.js. Mais si le sujet vous intéresse, sachez qu'il existe des tonnes de modules Node.js dédiés aux templates. Le choix est immense ! Eh bien vous êtes des grands, vous devriez savoir comment faire pour renvoyer un message différent en fonction de la page demandée ! Non ? Une petite condition, un petit if, ça vous dit rien ? var http = require('http'); var url = require('url'); var server = http.createServer(function(req, res) { var page = url.parse(req.url).pathname; console.log(page); res.writeHead(200, {"Content-Type": "text/plain"}); if (page == '/') { res.write('Vous êtes à l\'accueil, que puis-je pour vous ?'); } else if (page == '/sous-sol') { res.write('Vous êtes dans la cave à vins, ces bouteilles sont à moi !'); } else if (page == '/etage/1/chambre') { res.write('Hé ho, c\'est privé ici !'); } res.end(); }); server.listen(8080); Hé oui, c'est basique, c'est roots, c'est parce que Node.js est bas niv... bon OK je me tais. Allez un petit défi pour vous entraîner : faites en sorte d'afficher un message d'erreur si le visiteur demande une page inconnue. Et n'oubliez pas de renvoyer un code d'erreur 404 ! Quels sont les paramètres ? Les paramètres sont envoyés à la fin de l'URL, après le chemin du fichier. Prenez cette URL par exemple : http://localhost:8080/page?prenom=Robert&nom=Dupont Les paramètres sont contenus dans la chaîne ?prenom=Robert&nom=Dupont. Pour récupérer cette chaîne, il suffit de faire appel à : url.parse(req.url).query Le problème, c'est qu'on vous renvoie toute la chaîne sans découper au préalable les différents paramètres. Heureusement, il existe un module Node.js qui s'en charge pour nous : querystring ! Incluez ce module : var querystring = require('querystring'); Vous pourrez ensuite faire : var params = querystring.parse(url.parse(req.url).query); Vous disposerez alors d'un tableau de paramètres "params". Pour récupérer le paramètre "prenom" par exemple, il suffira d'écrire :params['prenom']. Amusons-nous avec un code complet qui affiche votre prénom et votre nom (pourvu que ceux-ci soient définis !) : var http = require('http'); var url = require('url'); var querystring = require('querystring'); var server = http.createServer(function(req, res) { var params = querystring.parse(url.parse(req.url).query); res.writeHead(200, {"Content-Type": "text/plain"}); if ('prenom' in params && 'nom' in params) { res.write('Vous vous appelez ' + params['prenom'] + ' ' + params['nom']); } else { res.write('Vous devez bien avoir un prénom et un nom, non ?'); } res.end(); }); server.listen(8080); Essayez d'aller sur http://localhost:8080?prenom=Robert&nom=Dupont pour voir, puis changez le prénom et le nom pour les remplacer par les vôtres ! Deux petites précisions par rapport à ce code : 'prenom' in params me permet en JavaScript de tester si le tableau contient bien une entrée 'prenom'. S'il manque un paramètre, je peux alors afficher un message d'erreur (sinon mon script aurait affichéundefinedà la place). Par ailleurs, vous constaterez que je ne vérifie pas la page qui est appelée. Ce code fonctionne aussi bien que l'on soit sur http://localhost:8080 ou sur http://localhost:8080/pageimaginaire. Il faudrait combiner ce code et le précédent pour gérer à la fois la page ET les paramètres. uploads/S4/ node-js-copie.pdf
Documents similaires










-
34
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Mai 11, 2021
- Catégorie Law / Droit
- Langue French
- Taille du fichier 0.1460MB