Node JS: Premiers pas

05 janvier 2018 rdorigny 0 commentaires

On parle beaucoup de Node JS dans le milieu de l'informatique. Généralement, les avis sont assez tranchés. Soit on est fan , soit on en dit en beaucoup de mal...

Testons cette nouvelle plateforme qui fait beaucoup causer. En première approche, points forts : logiciel libre, programmation événementielle, code identique sur le client ou le serveur, très performante, besoin de peu de ressources; point faibles : beaucoup de développements parallèles fait que l'on s'y perd un peu, pas encore mature pour réaliser des applications métier enfin le choix javascript n'est pas très judicieux (code ancien, pas facilement factorisable)


Après l'avantage indéniable de javascript est qu'il est interprété par la plupart des navigateurs actuels.

1) Démarrage

L'installation sur Windows 10 se fait sans difficulté sur le site https://nodejs.org/en/.
Pour vérifier que l'installation a été effectuée correctement:


On peut taper les commandes directement dans le terminal.


2) Afficher une page web

2.1) Utiliser le module http

Le truc puissant avec Node JS c'est l'instanciation d'un serveur web en quelques lignes de code. En effet, il suffit de monter le module http:
var PORT=8080; //on charge module http var http=require('http'); //on prepare le serveur, req pour la requete et res pour le resultat var server=http.createServer(function(req,res){ res.writeHead(200,{'Content-Type': 'text/html'}); res.write( '<doctype html>'+ '<html>'+ '<head>'+ '<title>Test de serveur node js</title>'+ '</head>'+ '<body>'+ 'Une page en html!'+ '</body>'+ '</html>' ); res.end(); }); //on lance le serveur server.listen(PORT); console.log('Le serveur web est actif sur le port '+PORT);

2.2) Le module swig

Node js fonctionne principalement sous forme de module que l'on utilise pour développer son programme (on se rapproche un peu de la philosophie de Python). Nous allons utiliser module swig qui permet de faire des modèles de page web.

Voici un template avec une variable pour personnaliser la page html:
<doctype html> <html> <head> <title>Test de serveur node js</title> </head> <body> {{txt}} </body> </html>
Le script js devient alors:
var PORT=8080; //on charge module http var http=require('http'); var swig=require('swig'); //on prepare le serveur, req pour la requete et res pour le resultat var server=http.createServer(function(req,res){ res.writeHead(200,{'Content-Type': 'text/html'}); res.write(swig.renderFile('templates/home.tpl',{ txt : 'Une page en swig html!'})); res.end(); }); //on lance le serveur server.listen(PORT); console.log('Le serveur web est actif sur le port '+PORT);

Il est possible de réaliser des fonctions tel que:
//on charge les modules var http=require('http'); var swig=require('swig'); //on prepare le serveur, req pour la requete et res pour le resultat exports.startServer=function(port){ var server=http.createServer(function(req,res){ res.writeHead(200,{'Content-Type': 'text/html'}); res.write(swig.renderFile('templates/home.tpl',{ txt : 'Une page en swig html!'})); res.end(); }); //on lance le serveur server.listen(port); //console.log('Le serveur web est actif sur le port '+port); }

Pour lancer:
var PORT=8080; var server=require('./Node_svr2.js'); server.startServer(PORT);

2.3) Gestion de l'url

Il faut désormais traiter les pages inexistantes (erreur 404):
//on charge les modules var http=require('http'); var swig=require('swig'); var url=require('url'); //on prepare le serveur, req pour la requete et res pour le resultat exports.startServer=function(port){ var server=http.createServer(function(req,res){ var recpt=url.parse(req.url).pathname; if (recpt==='/'){ res.writeHead(200,{'Content-Type': 'text/html'}); res.write(swig.renderFile('templates/home.tpl',{ txt : 'Une page en swig html!'})); } else { res.writeHead(404,{'Content-Type': 'text/html'}); res.write('Erreur 404!'); } res.end(); }); //on lance le serveur server.listen(port); //console.log('Le serveur web est actif sur le port '+port); }

3) Récupérer les données transmises

3.1) Récupérer les données en get

On utilisera le module querystring qui récupère les données dans l'url.
//on charge les modules var http=require('http'); var swig=require('swig'); var url=require('url'); var querystring=require('querystring'); //on prepare le serveur, req pour la requete et res pour le resultat exports.startServer=function(port){ var server=http.createServer(function(req,res){ var recpt=url.parse(req.url).pathname; if (recpt==='/'){ var params=querystring.parse(url.parse(req.url).query); var data={txt:'rien reçu'}; if ('txt' in params) { data['txt']=params['txt']; } res.writeHead(200,{'Content-Type': 'text/html'}); res.write(swig.renderFile('templates/home.tpl',data)); } else { res.writeHead(404,{'Content-Type': 'text/html'}); res.write('Erreur 404!'); } res.end();}); server.listen(port);}

3.2) Récupérer les données en post

Il faut insérer un formulaire dans le template:
<pre><doctype html> <html> <head> <title>Test de serveur node js</title> </head> <body> <BR> {{name}} <form action='message' method='post' /> <textarea rows='5' cols='20' name='msg'></textarea> <input type='submit' value='transmission' /> </form> </body> </html> </pre>
Et la page devient :
//on charge les modules var http=require('http'); var swig=require('swig'); var url=require('url'); var querystring=require('querystring'); function gestion404(res){ res.writeHead(404,{'Content-Type': 'text/html'}); res.write('Erreur 404'); res.end(); } exports.startServer=function(port){ var server=http.createServer(function(req,res){ var page=url.parse(req.url).pathname; if (page==='/'){ var params=querystring.parse(url.parse(req.url).query); var data={name:'rien reçu'}; if ('name' in params) { data['name']=params['name']; } res.writeHead(200,{'Content-Type': 'text/html'}); res.write(swig.renderFile('templates/home.tpl',data)); res.end(); } else if (page==='/message'){ if (req.method==='POST'){ var post_data=''; req.on('data',function(p_data){ post_data+=p_data; }); req.on('end',function(){ var final_data=querystring.parse(post_data); if ('msg' in final_data){ console.log('Le message : '+final_data['msg']); res.writeHead(200,{'Content-Type': 'text/html'}); res.write('Données recues:'+final_data['msg']); res.end(); } else { console.log('Rien recu'); res.writeHead(200,{'Content-Type': 'text/html'}); res.write('Rien recu'); res.end(); } }); } else{gestion404(res);} }else{gestion404(res);} }); //on lance le serveur server.listen(port); console.log('Le serveur web est actif sur le port '+port); }
Pour visualiser on tape http://localhost:8080.

Conclusion

Cet article a permis une introduction au monde un peu particulier de la programmation Node Js. Premières impressions : intéressant pour porter sur une plateforme qui dispose de peu de ressource (comme un Raspberry Pi ou un container). Mais pour un développement professionnel, cela reste à voir. La techno est jeune, et il y a encore beaucoup de chemin à parcourir pour en faire une plateforme reconnue.









Pseudonyme (obligatoire) :
Adresse mail (obligatoire) :
Site web :




© 2018 www.doritique.fr par Robert DORIGNY