Documente Academic
Documente Profesional
Documente Cultură
Avant-propos
avaScript est dcidment un langage tonnant. Lanc par Brendan Eich en 1995
dans le navigateur Netscape pour permettre le dveloppement ct client (cest-dire lexcution de code sur la machine du visiteur), il est aujourdhui devenu un
langage incontournable du Web.
Jusquici, JavaScript pouvait tre utilis uniquement du ct client... et voil que depuis
peu il est aussi possible de lutiliser pour dvelopper ct serveur ! PHP, Java, Python,
Ruby et les autres nont qu bien se tenir !
Tout le petit monde du dveloppement web est en bullition et na dyeux que pour
Node.js et les perspectives quil ouvre pour le dveloppement en JavaScript ct serveur.
Pourquoi ? Parce que la conception de Node.js est trs diffrente de ce quon a lhabitude
de voir. Tout est bas sur un systme dvnements qui lui permet dtre extrmement
efficace, ce qui lui confre sa rputation de rapidit... et aussi une certaine complexit
parfois, il faut bien lavouer !
Mon but dans ce cours est de vous faire dcouvrir lutilisation de Node.js pas pas
avec plusieurs applications pratiques. tant donn que Node.js est assez complexe
prendre en main, jai fait de mon mieux pour que votre apprentissage soit le plus
progressif possible et que vous preniez autant de plaisir que moi avec cette nouvelle
faon de programmer !
CHAPITRE 0. AVANT-PROPOS
2. Structurer son application Node.js : ce sera le moment de rentrer plus en
profondeur dans le fonctionnement dune application Node.js. Nous parlerons
dvnements, de modules et du framework Express.js, puis raliserons ensemble
une todo list ;
3. La communication temps rel avec socket.io : socket.io est lune des bibliothques les plus clbres de Node.js car elle permet une communication en
temps rel dans les deux sens entre le client et le serveur. A la cl : nous serons
capables de raliser un vritable Chat temps rel en ligne !
Ces codes web ont deux intrts :
ils vous redirigent vers les sites web prsents tout au long du cours, vous permettant ainsi dobtenir les logiciels dans leur toute dernire version ;
ils vous permettent dafficher les codes sources inclus dans ce livre, ce qui vous
vitera davoir recopier certains programmes un peu longs.
ii
iii
CHAPITRE 0. AVANT-PROPOS
iv
Avant-propos
ii
ii
ii
ii
Comprendre Node.js
Le moteur V8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 Installer Node.js
Installation de Node.js sous Windows
13
. . . . . . . . . . . . . . . . . . . . . .
14
17
19
20
23
24
II
25
Dissquons du code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
27
28
31
31
33
Schma rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
4 Les vnements
37
38
40
43
44
46
Trouver un module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
Installer un module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
49
50
50
51
52
Publier un module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
6 Le framework Express.js
vi
35
55
Les routes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
Routes simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
Routes dynamiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
Les templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
60
60
61
. . . . . . . . . . . . . . . . . . . .
62
64
7 TP : la todo list
67
Besoin daide ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
68
68
Les routes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
70
Correction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
La solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
Les explications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
73
Tlcharger le projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
74
74
III
75
77
78
80
Installer socket.io . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
80
80
83
. . . . . . . . . . . . . . . . . . . . . . .
87
87
88
9 TP : le super Chat
95
Besoin daide ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
96
package.json . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
97
app.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
97
index.html . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
98
Correction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
98
package.json . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
99
app.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
99
index.html . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
vii
viii
Premire partie
Comprendre Node.js
Chapitre
Figure 1.2 Le schma classique : PHP sur le serveur, JavaScript chez le client
a, a ne change pas.
Par contre, Node.js offre un environnement ct serveur qui nous permet aussi dutiliser le langage JavaScript pour gnrer des pages web. En gros, il vient en remplacement de langages serveur comme PHP, Java EE, etc. (Voir la figure 1.3)
Figure 1.3 Avec Node.js, on peut aussi utiliser du JavaScript sur le serveur !
Oui, et parce que JavaScript est un langage bas sur les vnements, donc Node.js
est lui-mme bas sur les vnements. Du coup, cest toute la faon dcrire des
applications web qui change ! Cest de l que Node.js tire toute sa puissance et sa
rapidit.
6
Le moteur V8
Node.js utilise le moteur dexcution ultrarapide V8 de Google Chrome. Ce
moteur V8 avait beaucoup fait parler de lui la sortie de Google Chrome, car cest
un outil open source cr par Google qui analyse et excute du code JavaScript trs
rapidement. (Voir figure 1.5)
T l charger un fichier
Afficher le fichier
Faire autre chose
Les actions sont effectues dans lordre. Il faut lire les lignes de haut en bas :
1. Le programme va tlcharger un fichier sur Internet.
2. Le programme affiche le fichier lutilisateur.
8
T l charger un fichier
D s que c ' est termin , afficher le fichier
Faire autre chose
Le programme nexcute plus les lignes dans lordre o elles sont crites. Il fait ceci :
1. Le programme lance le tlchargement dun fichier sur Internet.
2. Le programme fait dautres choses (le programme suit son cours).
3. Ds que le tlchargement est termin, le programme effectue les actions quon
lui avait demandes : il affiche le fichier.
Schmatiquement, lexcution du programme peut donc se reprsenter comme la figure
1.6.
request ( ' http :// www . site . com / fichier . zip ' , function ( error ,
response , body ) {
console . log ( " Fichier t l charg ! " ) ;
}) ;
console . log ( " Je fais d ' autres choses en attendant ... " ) ;
2
3
4
5
6
7
8
request ( ' http :// www . site . com / fichier . zip ' , callback ) ;
console . log ( " Je fais d ' autres choses en attendant ... " ) ;
La fonction de callback est enregistre dans une variable. Comme toutes les fonctions,
elle nest pas excute tant quon ne la pas appele. Ensuite, on envoie cette fonction
de callback en paramtre de la fonction request() pour dire : Ds que la requte
de tlchargement est termine, appelle cette fonction de callback.
En pratique, les dveloppeurs JavaScript mettent rgulirement des fonctions anonymes directement lintrieur dautres fonctions en paramtre, comme dans mon
premier code. Cest un peu trange au dbut, mais on sy fait vite !
Je ne vois pas pourquoi a rendrait le programme plus rapide. Jai limpression
que a le rend surtout plus compliqu !
Je vous avais dit que Node.js ntait pas simple, mais le jeu en vaut la chandelle !
Vous allez comprendre pourquoi. Imaginez quon demande le tlchargement de deux
fichiers Node.js :
1
2
3
4
5
10
request ( ' http :// www . site . com / fichier . zip ' , callback ) ;
request ( ' http :// www . site . com / autrefichier . zip ' , callback ) ;
Figure 1.7 En modle non bloquant (comme Node.js), les 2 fichiers sont tlchargs
en mme temps et lensemble finit plus vite
Dans les applications web, il est courant davoir des oprations longues et bloquantes
comme :
Les appels aux bases de donnes.
Les appels des services web (ex : lAPI de Twitter).
Node.js nous vite de perdre du temps en nous permettant de faire dautres choses en
attendant que les actions longues soient termines !
En rsum
Node.js est un environnement de dveloppement qui permet de coder ct serveur en JavaScript. En ce sens il peut tre compar PHP, Python/Django,
Ruby on Rails, etc.
crire une application en Node.js demande une gymnastique desprit particulire : tout est bas sur des vnements !
Node.js est reconnu et apprci pour sa rapidit : un programme Node.js
nattend jamais inutilement sans rien faire !
11
12
Chapitre
Installer Node.js
Difficult :
Vous tes convaincus ? Vous voulez vous mettre Node.js ? Trs bien ! Nattendons pas et
installons la bte ! Dans ce chapitre, nous couvrirons linstallation pour Windows, Mac OS
X et Linux. Vous devez juste lire la section qui correspond votre systme dexploitation.
Il ny aura rien de bien difficile ici rassurez-vous.
Ensuite, nous testerons une toute premire application trs simple pour vrifier que Node.js
est bien install et fonctionne correctement. Je vous conseille de lire cette section si vous
voulez tre prts pour le prochain chapitre.
13
Cliquez simplement sur le lien Install. Vous pouvez aussi vous rendre sur la page des
tlchargements pour avoir plus doptions (voir figure 2.7).
15
Node.js : cest linterprteur de commandes de Node.js (dont nous parlerons la fin de ce chapitre). Nous lutiliserons assez peu en pratique. Il sert
tester des commandes JavaScript.
Node.js command prompt : cest une console de Windows configure pour
reconnatre Node.js. Cest par l que vous passerez pour lancer vos programmes
Node.js, cest donc ce que nous utiliserons le plus souvent. (Voir les figures 2.5
et 2.6)
16
Si vous voulez plus doptions, affichez la page de tlchargement grce au code web
suivant :
Page des tlchargements
B
Code web : 914330
Le mieux est de prendre linstalleur (fichier .pkg). Il ouvre un assistant dinstallation (voir figure 2.8) dans lequel il suffit de cliquer frntiquement sur Continuer,
Continuer, Continuer, Terminer.
Une fois linstallation termine, vous pouvez vrifier que Node.js fonctionne correctement en tapant la commande node dans la console. Ouvrez une fentre de Terminal (le
Terminal tant install par dfaut sous Mac OS X), en allant dans le Finder, section
Applications , Terminal . Je vous conseille de mettre un raccourci dans le dock !
Tapez quelques commandes comme node -v (pour avoir le numro de version) ou node
tout court pour lancer linterprteur interactif (voir figure 2.9).
Lorsque linterprteur est lanc, vous pouvez taper des commandes JavaScript et obtenir une rponse. Ici, par exemple, jai demand combien font 1 et 1.
Pour quitter linterprteur, faites Ctrl + D (cest la commande classique qui demande quitter un interprteur sous Linux et Mac).
17
La premire affiche le numro de version de Node.js que vous avez install. La seconde
lance linterprteur interactif de Node.js. Vous pouvez y taper du code JavaScript
(essayez simplement de taper 1+1 pour voir). Pour sortir de linterprteur, faites
Ctrl + D.
Rassurez-vous, nous ncrirons pas nos programmes dans linterprteur interactif. Nous
crerons plutt des fichiers .js et demanderons Node de les excuter.
Depuis les versions les plus rcentes de Node.js, il faut savoir que NPM
est install en mme temps automatiquement. NPM est le gestionnaire de
paquets de Node.js (cest un peu lquivalent de apt, mais pour les extensions
Node.js). NPM est vraiment un outil formidable qui nous permet dtendre
les possibilits de Node.js linfini, nous le dcouvrirons un peu plus tard.
Enregistrez votre fichier sous lextension .js. Par exemple test.js. Ensuite, ouvrez une
console dans le dossier o se trouve votre fichier test.js et entrez la commande node
test.js. Vous devriez avoir le rsultat suivant dans la console :
$ node test . js
Bienvenue dans Node . js !
Bravo, vous avez cr votre tout premier programme Node.js ! Ctait vraiment ce que
lon pouvait faire de plus simple. On a simplement demand crire un message dans
la console.
Vous avez vu que pour lancer un programme Node.js, il suffisait dindiquer le nom du
fichier .js excuter. Vous savez tout ce quil faut savoir pour le moment !
Dans le prochain chapitre, nous attaquerons les choses srieuses : nous allons crer
notre premire vraie application Node.js. Attention, a va se corser !
20
En rsum
Que ce soit sous Windows, Mac ou Linux, linstallation de Node.js est simple.
Une application Node.js scrit dans un fichier JavaScript lextension .js.
Une application Node.js se lance avec la commande node nomdufichier.js.
21
22
Chapitre
23
Figure 3.2 Node.js est monothread, mais il est souple grce aux vnements
2
3
4
5
6
7
Cest en quelque sorte le code minimal pour un projet Node.js. Placez-le dans un
fichier que vous appellerez serveur.js (par exemple).
Il cre un mini-serveur web qui renvoie un message Salut tout le monde dans tous les
cas, quelque soit la page demande. Ce serveur est lanc sur le port 8080 la dernire
ligne.
25
Dissquons du code
Dcomposons le code :
1
2
3
4
5
6
7
8
Il est trs important que vous compreniez ce principe, car Node.js ne fonctionne que
comme a. Il y a des fonctions de callback partout et, en gnral, elles sont places
lintrieur des arguments dune autre fonction comme je lai fait dans mon premier
code. Cela parat un peu dlicat lire, mais vous prendrez vite le pli, rassurez-vous.
Noubliez pas de bien fermer la fonction de callback avec une accolade, de fermer les
parenthses dappel de la fonction qui lenglobe, puis de placer le fameux point-virgule.
Cest pour a que vous voyez les symboles }); la dernire ligne de mon premier code.
La fonction de callback est donc appele chaque fois quun visiteur se connecte
notre site. Elle prend deux paramtres :
26
On vite dutiliser ici le port 80 qui est normalement rserv aux serveurs web
car celui-ci est peut-tre dj utilis par votre machine. Ce port 8080 sert
juste pour nos tests videmment, une fois en production il est conseill au
contraire dcouter cette fois sur le port 80, car cest cette porte ( ce port)
que vos visiteurs iront taper en arrivant sur votre serveur.
La console naffiche rien et ne rpond pas, ce qui est parfaitement normal. Ouvrez maintenant votre navigateur et rendez-vous ladresse http://localhost:8080. Vous allez
vous connecter sur votre propre machine sur le port 8080 sur lequel votre programme
Node.js est en train dcouter ! Vous devriez obtenir quelque chose ressemblant la
figure 3.3.
Pour arrter votre serveur Node.js, retournez dans la console et faites Ctrl + C
pour couper la commande.
27
Ce sont ce quon appelle les types MIME. Ils sont envoys dans len-tte de la rponse
du serveur. Vous vous souvenez comment on crit dans len-tte de la rponse avec
Node.js ? Nous avions crit ceci :
1
28
res . writeHead ( 200 , { " Content - Type " : " text / html " }) ;
res . end ( ' <p > Voici un paragraphe < strong > HTML </ strong > ! </p > ') ;
2
3
4
5
6
7
Essayez-le comme vous lavez appris, en lanant lapplication avec la commande node
dans la console et en ouvrant votre navigateur sur http://localhost:8080 (voir figure
3.4).
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
On fait ce quon peut avec ce quon a ! Rappelez-vous que Node.js est bas niveau. . .
Je vous rassure, aucun dveloppeur ne samusera vraiment faire des pages web
HTML complexes comme a l-dedans. Il existe des moyens de sparer le code HTML
du code JavaScript : ce sont les systmes de templates. Cest un peu hors sujet
pour le moment, tant donn que nous commenons tout juste dcouvrir les bases
de Node.js. Mais si le sujet vous intresse, sachez quil existe des tonnes de modules
(voir le code web suivant) :
Des modules Node.js ddis
B aux templates
Code web : 272512
Le choix est immense !
30
Ensuite, il nous suffit de parser la requte du visiteur comme ceci pour obtenir le
nom de la page demande :
1
3
4
5
6
7
8
9
10
11
Je nai charg que la page daccueil, pourquoi est-ce que je vois /favicon.ico ?
31
Si on omet les favicon.ico qui viennent un peu polluer la console, on voit que jai essay
de charger les pages suivantes :
http://localhost:8080/testpage
http://localhost:8080/un/long/chemin
http://localhost:8080/faussepage.html
Vous pouvez retrouver la page directement grce au code web suivant :
Page faussepage
B
Code web : 528764
Et alors ? Mon site renvoie toujours la mme chose quelle que soit la page
appele !
En effet. Mais il suffit dcrire une condition, et le tour est jou !
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
32
}) ;
server . listen ( 8080 ) ;
Allez un petit dfi pour vous entraner : faites en sorte dafficher un message derreur si
le visiteur demande une page inconnue. Et noubliez pas de renvoyer un code derreur
404 !
Le problme, cest quon vous renvoie toute la chane sans dcouper au pralable les
diffrents paramtres. Heureusement, il existe un module Node.js qui sen charge pour
nous : querystring !
Incluez ce module :
1
Vous disposerez alors dun tableau de paramtres params. Pour rcuprer le paramtre
prenom par exemple, il suffira dcrire : params[prenom].
Amusons-nous avec un code complet qui affiche votre prnom et votre nom (pourvu
que ceux-ci soient dfinis !) :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
33
Schma rsum
Rsumons ce que nous venons dapprendre dans un seul et unique schma (voir figure
3.5) avant de terminer.
En rsum
Avec Node.js, votre application doit grer le serveur web (quivalent dApache)
en plus de ses propres fonctionnalits. Elle doit notamment dterminer le nom
de la page demande et ses paramtres pour savoir ce quelle doit renvoyer au
visiteur.
Les bibliothque de Node.js sont appeles des modules et on les charge avec
require()
Avec Node.js, on envoie frquemment des fonctions en paramtre dautres fonctions. Cela permet dindiquer la fonction suivante appeler lorsquune tche est
termine.
Votre application devra gnralement renvoyer du HTML au navigateur du
visiteur avec la mthode write().
34
Deuxime partie
35
Chapitre
Les vnements
Difficult :
Node.js est un environnement de dveloppement JavaScript bas sur les vnements.
Je vous ai montr dans le premier chapitre ce que a signifie : il y a un seul thread mais
aucune opration nest bloquante. Ainsi, les oprations un peu longues (chargement dun
fichier, tlchargement dune page web, dmarrage dun serveur web. . .) sont lances en
tche de fond et une fonction de callback est appele quand lopration est termine.
Les vnements sont la base de Node.js. Cest ce qui fait que Node.js est puissant mais
aussi un peu plus difficile apprhender puisque il nous impose de coder avec beaucoup de
fonctions de callback. Je vous propose de rentrer ici dans les dtails du fonctionnement
des vnements Node.js. Nous verrons en particulier comment on peut couter et
crer des vnements. Tout dveloppeur Node.js qui se respecte doit savoir le faire,
alors au boulot !
37
Figure 4.1 La doc de Node.js indique les vnements que les objets mettent
Comment couter ces vnements ? Supposons par exemple quon souhaite couter
lvnement close qui survient quand le serveur est arrt. Il suffit de faire appel la
mthode on() et dindiquer :
Le nom de lvnement que vous coutez (ici close).
La fonction de callback appeler quand lvnement survient.
Exemple :
1
2
3
38
2
3
4
5
6
7
8
9
10
11
12
13
14
Bref, les vnements sont partout, vous ne pouvez pas y chapper ! Certains sont
simplement un peu masqus comme cest le cas ici, mais il est important de savoir
ce qui se passe derrire.
Vous pouvez couter plusieurs fois un mme vnement. Faites deux fois
appel la fonction on() pour le mme vnement : les deux fonctions de
callback seront appeles quand lvnement aura lieu.
39
2
3
Ensuite, pour mettre un vnement dans votre code, il suffit de faire appel emit()
depuis votre objet bas sur EventEmitter. Indiquez :
Le nom de lvnement que vous voulez gnrer (ex : gameover). vous de le
choisir.
Un ou plusieurs ventuels paramtres passer (facultatif).
Ici, je gnre un vnement gameover et jenvoie un message celui qui rceptionnera
lvnement via un paramtre :
1
jeu . emit ( ' gameover ' , ' Vous avez perdu ! ') ;
2
3
4
5
6
7
8
9
jeu . emit ( ' gameover ' , ' Vous avez perdu ! ') ;
jeu . emit ( ' nouveaujoueur ' , ' Mario ' , 35 ) ; // Envoie le nom d ' un
nouveau joueur qui arrive et son ge
En rsum
Toutes les applications Node.js sont bases sur un mcanisme dvnements,
qui dtermine quelle est la prochaine fonction appeler.
40
41
42
Chapitre
43
Elle tait tout au dbut de notre premier code. Je vous avais dit que ctait un appel
la bibliothque http de Node.js (ou devrais-je dire au module http ).
Lorsque lon effectue cela, Node.js va chercher sur notre disque un fichier appel
http.js. De mme, si on demande le module url , Node.js va rechercher un fichier
appel url.js.
1
2
Ils sont quelque part bien au chaud sur votre disque, leur position ne nous intresse pas.
tant donn quils font partie du noyau de Node.js, ils sont tout le temps disponibles.
Les modules sont donc de simples fichiers .js. Si nous voulons crer un module,
disons le module test , nous devons crer un fichier test.js dans le mme dossier
et y faire appel comme ceci :
1
Cest un chemin relatif. Si le module se trouve dans le dossier parent, nous pouvons
linclure comme ceci :
1
var test = require ( ' ../ test ') ; // Fait appel test . js ( dossier
parent )
44
var test = require ( ' test ') ; // Fait appel test . js ( sous dossier node_modules )
Cest du code JavaScript tout ce quil y a de plus classique. Vous y crez des fonctions.
Une seule particularit : vous devez exporter les fonctions que vous voulez que
dautres personnes puissent rutiliser.
Testons cela ! Nous allons crer un module tout bte qui sait dire Bonjour ! et Bye
bye ! . Crez un fichier monmodule.js avec le code suivant :
1
2
3
45
8
9
10
Le dbut du fichier ne contient rien de nouveau. Nous crons des fonctions que nous
plaons dans des variables. Do le var direBonjour = function().
Ensuite, et cest la nouveaut, nous exportons ces fonctions pour quelles soient utilisables de lextrieur : exports.direBonjour = direBonjour;. Notez dailleurs quon
aurait aussi pu faire directement :
1
Toutes les fonctions que vous nexportez pas dans votre fichier de module
resteront prives. Elles ne pourront pas tre appeles de lextrieur. En revanche, elles pourront tout fait tre utilises par dautres fonctions de votre
module.
Maintenant, dans le fichier principal de votre application (ex : app.js), vous pouvez
faire appel ces fonctions issues du module !
1
2
3
4
monmodule . direBonjour () ;
monmodule . direByeBye () ;
require() renvoie en fait un objet qui contient les fonctions que vous avez exportes
dans votre module. Nous stockons cet objet dans une variable du mme nom monmodule
(mais on aurait pu lui donner nimporte quel autre nom), comme la figure 5.2.
Voil, vous savez tout ! Tous les modules de Node.js sont bass sur ce principe trs
simple. Cela vous permet de dcouper votre projet en plusieurs petits fichiers pour
rpartir les rles.
Je vous ai dit que ctait un moyen (formidable) dinstaller de nouveaux modules
dvelopps par la communaut.
46
Trouver un module
Si vous savez ce que vous cherchez, le site web de NPM vous permet de faire une recherche. Mais NPM, cest avant tout une commande ! Vous pouvez faire une recherche
dans la console, comme ceci :
npm search postgresql
Ce qui aura pour effet de rechercher tous les modules en rapport avec la base de donnes
PostgreSQL.
Si comme moi vous voulez flner un peu et que vous ne savez pas trop ce que vous
recherchez, vous aimerez srement le site Nodetoolbox (voir le code web suivant) :
47
Il organise les modules par thmatique (voir figure 5.3).
Figure 5.3 Le site Node Toolbox est un bon moyen de dcouvrir de nouveaux modules
Installer un module
Pour installer un module, rien de plus simple. Placez-vous dans le dossier de votre
projet et tapez :
npm install nomdumodule
Le module sera install localement spcialement pour votre projet. Si vous avez un
autre projet, il faudra donc relancer la commande pour linstaller nouveau pour cet
autre projet. Cela vous permet dutiliser des versions diffrentes dun mme module en
fonction de vos projets.
Allez faisons un test. On va installer le module markdown qui permet de convertir du
code markdown en HTML.
npm install markdown
On nous apprend quil faut faire appel lobjet markdown lintrieur du module et
quon peut appeler la fonction toHTML pour traduire du Markdown en HTML.
Essayons a :
1
2
3
Les modules installs globalement ne peuvent pas tre inclus dans vos projets
Node.js avec require() ! Ils servent juste fournir des commandes supplmentaires dans la console. Si vous voulez les utiliser en JavaScript, vous
devez donc aussi les installer normalement (sans le -g) en local.
49
NPM va chercher sur les serveurs sil y a de nouvelles versions des modules, puis
mettre jour les modules installs sur votre machine (en veillant ne pas casser la
compatibilit) et il supprimera les anciennes versions. Bref, cest la commande magique.
2
3
4
5
6
7
Cheat sheet
B
Code web : 967025
1
2
3
Si vous faites un npm update pour mettre jour les modules externes, markdown ne
sera jamais mis jour (mme si lapplication passe en version 0.3.6). Vous pouvez
mettre un tilde (~) devant le numro de version pour autoriser les mises jour jusqu
la prochaine version mineure :
" dependencies " : {
" markdown " : " ~ 0 . 3 . 5 " // OK pour les versions 0 . 3 .5 , 0 . 3 .6 ,
0 . 3 .7 , etc . jusqu ' la version 0 . 4 . 0 non incluse
}
1
2
3
Si vous voulez, vous pouvez ne pas indiquer de numro de patch. Dans ce cas, les
modules seront mis jour mme si lapplication change de version mineure :
" dependencies " : {
" markdown " : " ~ 0 . 3 " // OK pour les versions 0 . 3 .X , 0 . 4 .X , 0 .
5 . X jusqu ' la version 1 . 0 . 0 non incluse
}
1
2
3
Attention nanmoins : entre deux versions mineures, un module peut changer suffisamment et votre application pourrait tre incompatible. Je recommande daccepter
uniquement les mises jour de patch, cest le plus sr.
Publier un module
Avec Node.js, vous pouvez crer une application pour vos besoins, mais vous pouvez
aussi crer des modules qui offrent des fonctionnalits. Si vous pensez que votre module
pourrait servir dautres personnes, nhsitez pas le partager ! Vous pouvez trs
facilement le publier sur NPM pour que dautres personnes puissent linstaller leur
tour.
Je rappelle quun module nest rien dautre quune application Node.js qui
contient des instructions exports pour partager des fonctionnalits.
Commencez par vous crer un compte utilisateur sur npm :
npm adduser
Une fois que cest fait, placez-vous dans le rpertoire de votre projet publier. Vrifiez
que vous avez :
52
En rsum
Vous pouvez crer des modules Node.js pour mieux dcoupler votre code et
viter de tout crire dans un seul et mme fichier.
Vous appellerez vos modules avec require() comme vous le faites pour les
modules officiels de Node.js.
Toutes les fonctions dans le fichier de module qui peuvent tre appeles depuis
lextrieur doivent tre exportes avec la commande exports.
NPM est le gestionnaire de modules de Node.js. Comparable apt-get
et aptitude sous Linux / Debian, il permet dajouter de nouveaux modules
cods par la communaut en un clin dil.
Les modules tlchargs avec NPM sont par dfaut installs localement dans un
sous-dossier node_modules de votre application.
Lextension -g permet dinstaller un module globalement pour tout votre ordinateur. Elle nest utile que pour certains modules prcis.
Vous pouvez diffuser vos propres modules au reste de la communaut en crant
53
54
Chapitre
Le framework Express.js
Difficult :
Tout coder la main, a va cinq minutes. Cela peut tre utile dans certains cas prcis,
mais la plupart du temps, on aime avoir des outils disposition pour aller plus vite. Cest
pour cela quon a invent les bibliothques puis les frameworks, qui sont des sortes de
super-bibliothques.
55
Les routes
Nous avons vu quel point il tait fastidieux de vrifier lURL demande avec Node.js.
On aboutissait du bon vieux code spaghetti du type :
1
2
3
4
5
6
7
8
9
Lorsque lon cre des applications web, on manipule des routes comme ici. Ce sont les
diffrentes URLs auxquelles notre application doit rpondre.
La gestion des routes est un sujet important qui doit tre trait avec srieux. Si
vous avez dj manipul des frameworks comme Django ou Symfony2, vous voyez
certainement ce que je veux dire. Sinon, retenez juste ceci : bien grer les URLs de
son site est important, surtout lorsque celui-ci grossit. Et Express nous aide faire
cela correctement.
Routes simples
Voici une application trs basique utilisant Express pour commencer :
1
2
3
4
5
6
56
LES ROUTES
7
8
}) ;
9
10
Noubliez pas de faire npm install express pour que ce code fonctionne !
Vous commencez par demander linclusion dExpress et vous crez un objet app en
appelant la fonction express().
Ensuite, il vous suffit dindiquer les diffrentes routes (les diffrentes URLs) laquelle
votre application doit rpondre. Ici, jai cr une seule route, la racine / . Une
fonction de callback est appele lorsque quelquun demande cette route.
Ce systme est beaucoup mieux conu que nos if imbriqus. On peut crire autant de
routes quon le souhaite de cette faon :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Si vous voulez grer les erreurs 404, vous devez inclure les lignes suivantes la fin de
votre code obligatoirement (juste avant app.listen) :
1
2
3
4
5
6
7
8
Ne vous proccupez pas trop pour linstant de la syntaxe et des paramtres, nous y
reviendrons un peu plus tard. Nous apprenons juste grer les routes avec Express
pour le moment.
57
2
3
4
})
. get ( '/ sous - sol ' , function ( req , res ) {
5
6
7
})
. get ( '/ etage / 1 / chambre ' , function ( req , res ) {
8
9
10
})
. use ( function ( req , res , next ) {
11
12
}) ;
Cela revient faire app.get().get().get(). . . Cela fonctionne parce que ces fonctions
se renvoient lune lautre lobjet app, ce qui nous permet de raccourcir notre code.
Ne soyez donc pas tonns si vous voyez des codes utilisant Express crits sous cette
forme.
Routes dynamiques
Express vous permet de grer des routes dynamiques, cest--dire des routes dont
certaines portions peuvent varier. Vous devez crire :nomvariable dans lURL de la
route, ce qui aura pour effet de crer un paramtre accessible depuis req.params.nomvariable.
Dmonstration :
1
2
3
4
app . get ( '/ etage /: etagenum / chambre ' , function ( req , res ) {
res . setHeader ( ' Content - Type ' , ' text / plain ') ;
res . end ( ' Vous tes la chambre de l \ ' tage n ' + req .
params . etagenum ) ;
}) ;
Cela vous permet de crer de belles URLs et vous vite davoir passer par le suffixe
("?variable=valeur") pour grer des variables. Ainsi, toutes les routes suivantes sont
valides :
/etage/1/chambre
/etage/2/chambre
/etage/3/chambre
/etage/nawak/chambre
Comment a, on peut mettre nimporte quoi ? Comment fait-on pour imposer
la prsence dun nombre ?
Le visiteur peut en effet crire nimporte quoi dans lURL. Cest donc vous de vrifier
dans votre fonction de callback que le paramtre est bien un nombre et de renvoyer
une erreur (ou une 404) si ce nest pas le cas.
58
LES TEMPLATES
Les templates
Jusquici, nous avions renvoy le code HTML directement en JavaScript. Cela nous
avait donn du code lourd et dlicat maintenir qui ressemblait ceci :
1
2
3
4
5
6
7
8
9
10
Horrible, nest-ce pas ? Heureusement, Express nous permet dutiliser des templates
pour sortir de cet enfer. Les templates sont en quelque sorte des langages faciles
crire qui nous permettent de produire du HTML et dinsrer au milieu du contenu
variable.
PHP lui-mme est en ralit un langage de template qui nous permet de faire ceci :
1
<p > Vous tes le visiteur n <? php echo $numvisiteur ; ? > </p >
59
Installez-le pour le projet :
npm install ejs
Nous pouvons maintenant dlguer la gestion de la vue (du HTML) notre moteur
de template. Plus besoin dcrire du HTML au milieu du code JavaScript comme
un cochon !
1
2
3
app . get ( '/ etage /: etagenum / chambre ' , function ( req , res ) {
res . render ( ' chambre . ejs ' , { etage : req . params . etagenum }) ;
}) ;
Ce code fait appel un fichier chambre.ejs qui doit se trouver dans un sousdossier appel views . Crez donc un fichier /views/chambre.ejs et placez-y le
code suivant :
1
2
3
<p > Vous tes l ' tage n <%= etage % > </p >
La balise <%= etage %> sera remplace par la variable etage que lon a transmise au
template avec {etage: req.params.etagenum} !
On transmet le nombre envoy en paramtre et une liste de noms sous forme de tableau.
Ensuite, dans le template EJS :
1
2
60
<h1 > Je vais compter jusqu ' <%= compteur % > </ h1 >
6
7
<%= i % >...
8
9
10
11
12
13
<p > Tant que j 'y suis , je prends un nom au hasard qu ' on m 'a
envoy :
<%= noms [ Math . floor ( Math . random () * ( noms . length + 1 ) ) ] % >
</p >
Vous voyez quon peut faire des boucles avec les templates EJS. En fait, on utilise
la mme syntaxe que JavaScript (do la boucle for). Ma petite manipulation la fin
du code me permet de prendre un nom au hasard dans le tableau qui a t envoy au
template.
Et le rsultat la figure 6.2 (pour /compter/66).
Express est un framework construit au-dessus dun autre module appel Connect.
En fait, Express nest rien dautre que le module Connect auquel on a ajout
certaines fonctionnalits comme les routes et les vues.
Daccord, mais quest-ce que Connect dans ce cas ?
Cest un module qui permet dautres modules appels middlewares de communiquer entre eux, do son nom Connect . Il tend la fonctionnalit http.createServer()
fournie de base par Node.js et offre donc de nouvelles fonctionnalits.
Connect est fourni avec plus de dix-huitmiddlewares de base, et les dveloppeurs
peuvent bien entendu en proposer dautres via NPM. Les middlewares livrs avec
Connect fournissent chacun des micro-fonctionnalits. Il y a par exemple :
Compress : permet la compression gzip de la page pour un envoi plus rapide
au navigateur.
CookieParser : permet de manipuler les cookies.
Session : permet de grer des informations de session (durant la visite dun
visiteur).
Static : permet de renvoyer des fichiers statiques contenus dans un dossier
(images, fichiers tlcharger, etc.)
BasicAuth : permet de demander une authentification HTTP Basic, cest-dire une saisie dun login et dun mot de passe avant daccder une section
du site.
Csrf : fournit une protection contre les failles CSRF.
Etc.
Tous ces middlewares offrent vraiment des micro-fonctionnalits. Il y en a des tous
petits comme favicon par exemple, qui se contente de grer la favicon de votre
site (licne qui reprsente votre site).
Grce Connect, ces middlewares sont interconnects et peuvent communiquer
entre eux. Express ne fait quajouter les routes et les vues par-dessus lensemble (voir
schma la figure 6.3).
Le principe de Connect est que tous ces middlewares communiquent entre eux en
se renvoyant jusqu quatre paramtres :
Figure 6.3 Les fonctionnalits offertes par Express viennent en grande partie de
Connect
63
Je pourrais mtendre et prsenter les middlewares un un, mais ce serait long et
fastidieux (pour moi comme pour vous). Je ne souhaite pas rentrer plus dans le dtail,
mais jestime que vous savez lessentiel, ce qui tait le plus compliqu comprendre.
Je rsume : Express utilise Connect qui propose un ensemble de middlewares qui
communiquent entre eux. Appelez ces middlewares pour utiliser leurs fonctionnalits
et faites attention lordre dappel qui est important (on nactive pas un logger la
fin des oprations !).
Vous tes prts affronter le monde terrible et passionnant dExpress, un framework
incontournable qui volue rapidement. Bravo et bonne lecture de la documentation
maintenant !
64
En rsum
Express.js est un micro-framework pour Node.js. Les tches les plus courantes sont ainsi grandement facilites.
Express permet en particulier de grer plus simplement les routes (les diffrentes URL acceptes par votre application).
Express permet de faire le pont avec des moteurs de templates (comme
EJS). Ceux-ci nous permettent de sparer le code mtier (backend) du code
HTML (frontend). Finis les appels interminables la mthode write() !
Express est bas sur un autre module appel Connect. Celui-ci permet dappeler des mini-couches applicatives appeles middlewares qui offrent des
fonctionnalits comme les sessions, la compression gzip des pages, la manipulation des cookies, etc.
65
66
Chapitre
TP : la todo list
Difficult :
Je crois quil est grand temps de passer la pratique ! Nous avons fait le tour dun bon
nombre de fonctionnalits de base de Node.js et nous avons mme appris nous servir
du micro-framework Express. Pourtant, on a vraiment le sentiment davoir compris que
lorsque lon a pratiqu et ralis une premire vritable application. Cest ce que je vous
propose de faire dans ce TP.
Nous allons raliser ici une to do list (une liste de tches). Le visiteur pourra simplement
ajouter et supprimer des tches. Nous ferons donc quelque chose de trs simple pour
commencer. Vous pourrez ensuite lamliorer comme bon vous semble !
67
Besoin daide ?
Avant toute chose, je vais vous prsenter la page que nous devons crer ; il sagit de la
figure 7.1.
68
BESOIN DAIDE ?
3
4
5
6
7
8
9
10
Vous pouvez videmment remplacer le nom, lauteur et la description comme bon vous
semble.
Pour les numros de version dExpress et dEJS, je me suis bas sur les versions
disponibles au moment de la rdaction de ce cours. Comme lunivers de Node.js avance
vite, vous aurez srement des versions plus rcentes. Le tilde ( ~ ) permet dautoriser
les futurs patchs de ces modules, mais pas les nouvelles versions mineures ou majeures,
ce qui nous garantit que leur API ne changera pas, et donc que notre code continuera
fonctionner mme avec ces mises jour.
Maintenant que vous avez votre package.json, installez les dpendances avec un
simple :
npm install
Les routes
Je vous avais dit que bien dfinir ses routes tait important lorsque lon construit une
application web. Si vous hsitez et ne savez pas par o commencer, je vous invite
lister les routes de votre application. Que doit-elle faire ?
Lister les tches.
Ajouter une tche.
Supprimer une tche.
A priori, on peut associer une route chacune de ces fonctionnalits :
/todo : liste les tches.
/todo/ajouter : ajoute une tche.
/todo/supprimer/:id : supprime la tche nid.
Vous allez donc crire les routes comme ceci dans votre fichier app.js :
1
2
3
}) ;
4
5
// ...
En revanche, il faudrait que nous nous penchions un instant sur la question du formulaire. En gnral, les formulaires envoient les donnes avec la mthode POST et
69
2
3
})
Autre chose : nous aurons besoin de rcuprer les donnes du formulaire dans /todo/ajouter.
Nous avons appris rcuprer des paramtres depuis lURL mais pas depuis les formulaires. En fait, cest vraiment simple : il vous suffit dinclure le middleware que
vous trouverez sur le site propos dans le code web suivant. Vous aurez ensuite accs
req.body.nomDuChamp.
BodyParser
B
Code web : 267545
Du coup, le dbut de notre code JavaScript devrait ressembler quelque chose comme
a :
1
2
3
4
5
6
7
8
9
10
11
CORRECTION
Correction
Allez, cest lheure de la correction ! Ne lisez cette section que si vous avez russi ou
que toutes vos tentatives ont chou et que vous tes dsesprs.
Le code nest pas si difficile lire au final. Il nest pas trs long non plus, mais il fallait
bien rflchir pour trouver quoi crire exactement.
La solution
Voici le code JavaScript que jai produit dans le fichier principal app.js. Notez bien
que cest une faon de faire et que vous ntes pas obligs davoir produit un code
strictement identique au mien !
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
71
})
39
40
41
42
43
44
45
. listen ( 8080 ) ;
2
3
4
5
6
7
8
9
10
11
12
13
<ul >
<\% todolist . forEach ( function ( todo , index ) { \% >
<li > < a href = " / todo / supprimer / <\%= index \% > " >X </ a >
<\%= todo \% > </ li >
<\% }) ; \% >
</ ul >
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
< form action = " / todo / ajouter / " method = " post " >
<p >
< label for = " newtodo " > Que dois - je faire ? </ label
>
< input type = " text " name = " newtodo " id = " newtodo "
autofocus / >
< input type = " submit " / >
</p >
</ form >
</ body >
</ html >
72
CORRECTION
3
4
5
6
7
8
9
10
Les explications
Mon code est dj assez comment, cela devrait vous permettre de vous y retrouver.
Vous remarquerez que je me suis permis de rediriger le visiteur vers la liste (/todo)
aprs un ajout ou une suppression dlment, avec res.redirect(/todo).
La liste des tches est stocke dans un array (tableau). Cest dailleurs lui qui est la
cause de la petite subtilit de ce programme : comme JavaScript napprcie pas que
lon essaie de parcourir des arrays qui nexistent pas, jai cr un middleware qui
cre un array vide si le visiteur na pas de to do list (parce quil vient de commencer
sa session par exemple). Cest le rle de ce code :
1
2
3
4
5
6
73
<\% }) ; \% >
Tlcharger le projet
Je vous ai donn tout le code du projet, mais si vous insistez pour tlcharger le tout
dans un fichier .zip, aller sur le code web suivant. Noubliez pas de faire un npm install
pour installer les dpendances avant de lexcuter !
Fichier .zip
B
Code web : 543618
74
Troisime partie
75
Chapitre
77
Cest une nouveaut rcente apparue plus ou moins en mme temps que HTML5, mais
ce nest pas du HTML : cest une API JavaScript. WebSocket est une fonctionnalit
supporte par lensemble des navigateurs rcents. Elle permet un change bilatral
synchrone entre le client et le serveur.
Comment a je parle chinois ? ! Reprenons les bases. Habituellement, sur le web, la
communication est asynchrone. Le web a toujours t conu comme cela : le client
demande et le serveur rpond (voir figure 8.1).
WebSocket.
Adobe Flash Socket.
AJAX long polling.
AJAX multipart streaming.
Forever Iframe.
JSONP Polling.
79
Maintenant que nous en savons un petit peu plus sur le fonctionnement de socket.io,
si nous commencions lutiliser ?
Installer socket.io
La premire tape, aussi vidente soit-elle, est dinstaller socket.io. Ne riez pas, la
premire fois que jai voulu lutiliser jai bien perdu quinze minutes avant de comprendre
que javais oubli de faire un simple :
npm install socket . io
Je vous ai fait doncgagner 15 minutes de votre vie ! Ne me remerciez pas cest tout
naturel.
3
4
5
6
7
8
9
10
11
12
13
// Chargement de socket . io
var io = require ( ' socket . io ') . listen ( server ) ;
14
15
16
17
18
19
20
7
8
9
10
11
12
13
14
15
16
< script src = " / socket . io / socket . io . js " > </ script >
< script >
var socket = io . connect ( ' http :// localhost : 8080 ') ;
</ script >
</ body >
</ html >
< script src = " / socket . io / socket . io . js " > </ script >
82
Lorsque lon dtecte une connexion, on met un message au client avec socket.emit().
La fonction prend deux paramtres :
83
socket . emit ( ' message ' , { content : ' Vous tes bien connect ! ' ,
importance : '1 ' }) ;
Avec socket.on(), on coute les messages de type message. Lorsque des messages
arrivent, on appelle la fonction de callback qui, ici, affiche simplement une bote de
dialogue.
Essayez, vous verrez que lorsque vous chargez la page index.html, une bote de dialogue
saffiche indiquant que la connexion a russi (voir figure 8.3) !
Figure 8.3 Le client affiche le message du serveur dans une bote de dialogue
Le client veut envoyer un message au serveur
Maintenant, faisons linverse. Je vous propose dajouter un bouton dans la page web
et denvoyer un message au serveur lorsquon clique dessus.
Du ct du client (index.html), je vais rajouter un bouton Embter le serveur .
Lorsquon cliquera dessus, jmettrai un message au serveur. Voici le code complet :
84
7
8
9
10
11
<p > < input type = " button " value = " Emb ter le serveur " id = "
poke " / > </p >
12
13
14
15
16
17
18
19
< script src = " http :// code . jquery . com / jquery - 1 . 10 . 1 . min .
js " > </ script >
< script src = " / socket . io / socket . io . js " > </ script >
< script >
var socket = io . connect ( ' http :// localhost : 8080 ') ;
socket . on ( ' message ' , function ( message ) {
alert ( ' Le serveur a un message pour vous : ' +
message ) ;
})
20
21
22
23
24
25
26
Jutilise ici jQuery pour des raisons pratiques (parce que jai lhabitude) pour
rcuprer lvnement du clic sur le bouton, mais ce nest absolument pas
obligatoire. On peut faire a en pur JavaScript si on veut.
Finalement, le seul code nouveau et intressant ici est :
1
2
3
Il est trs simple. Lorsque lon clique sur le bouton, on envoie un message de type
message au serveur, assorti dun contenu.
Si on veut rcuprer cela du ct du serveur maintenant, il va nous falloir ajouter
lcoute des messages de type message dans la fonction de callback de la connexion :
1
2
85
}) ;
Lancez le code ! Cliquez sur le bouton Embter le serveur dans la page et regardez
dans la console du serveur. Vous devriez voir apparatre la figure 8.4.
Un client me parle ! Il me dit : Salut serveur , a va ?
Figure 8.4 Lorsque le client clique sur le bouton, le serveur ragit immdiatement
dans la console
86
socket . broadcast . emit ( ' message ' , ' Message toutes les unit s .
Je r p te , message toutes les unit s . ') ;
4
5
87
Figure 8.5 Dans un broadcast, le serveur envoie un message tous les autres clients
connects
6
7
8
}) ;
}) ;
Essayez maintenant douvrir deux onglets (ou plus) sur votre page http://localhost:8080.
Vous verrez que lorsquun nouveau client arrive, les autres pages ragissent instantanment pour dire : Un autre client vient de se connecter !
88
Tester le code
Essayez douvrir
deux fentres en donnant un pseudo diffrent chaque fois. Cliquez
ensuite sur Embter le serveur . Vous verrez dans la console que le pseudo de la
personne qui a cliqu sur le bouton apparat !
Jai fait un essai chez moi avec deux fentres, lune avec le pseudo mateo21 et lautre
avec le pseudo robert . la figure 8.6, vous voyez en bas de la console que celle-ci
reconnat bien qui vient de cliquer !
90
7
8
9
10
11
<p > < input type = " button " value = " Emb ter le serveur " id = "
poke " / > </p >
12
13
14
15
16
< script src = " http :// code . jquery . com / jquery - 1 . 10 . 1 . min .
js " > </ script >
< script src = " / socket . io / socket . io . js " > </ script >
< script >
var socket = io . connect ( ' http :// localhost : 8080 ') ;
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
3
4
5
6
7
8
9
10
11
12
13
// Chargement de socket . io
var io = require ( ' socket . io ') . listen ( server ) ;
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
}) ;
34
35
Jespre avoir suffisamment comment ce code pour que vous puissiez vous y retrouver.
Je rappelle que cest une application trs basique pour essayer les fonctionnalits de socket.io. Elle ne fait rien dintressant ou de passionnant, cest
vous de vous amuser la bidouiller pour vous entraner. Faites-en quelque
chose de bien. . . Enfin quelque chose de plus utile que ce que jai fait au
moins.
92
En rsum
Socket.io est un module de Node.js qui permet vos visiteurs de communiquer en continu (en temps rel) avec le serveur lorsque la page est charge.
Socket.io se base notamment sur les WebSockets, une sorte de super AJAX .
Votre application peut tout moment solliciter le serveur sans recharger la page,
et linverse est aussi vrai : vos visiteurs peuvent recevoir des messages du serveur
tout moment !
Le serveur et le client senvoient des vnements (avec socket.emit()) et
coutent les vnements quils se sont envoys (avec socket.on()).
Pour que lapplication fonctionne du ct du client, vous devez charger la bibliothque de socket.io dans la page HTML envoye au visiteur. La bibliothque
est situe dans /socket.io/socket.io.js.
Le serveur peut envoyer un message tous les clients connects au serveur avec
socket.broadcast.emit().
Le serveur peut sauvegarder les donnes de session dun client avec set() et les
rcuprer avec get(). Pratique pour que le client nait, par exemple, pas besoin
de renvoyer son pseudo chaque vnement !
93
94
Chapitre
TP : le super Chat
Difficult :
Alors, socket.io vous plat ? Une fois que lon a russi le prendre en main, ce qui nest
pas vraiment compliqu quand on commence avoir lhabitude de Node.js, il faut avouer
quun grand nombre de possibilits soffre tout dun coup nous ! Imaginez tout ce que
vous pouvez commencer faire en temps rel ! Un Chat, des jeux, des outils collaboratifs
pour le travail, etc.
Parmi lensemble de ces possibilits, je pense que le Chat est de loin lapplication la plus
simple raliser tout en restant utile et efficace pour impressionner vos proches. Alors
allons-y !
95
Besoin daide ?
Vous tes perdus ? Vous ne savez pas par o commencer ?
Allons allons, si vous avez bien suivi le chapitre prcdent sur socket.io cela ne devrait
pas trop vous poser de problmes. Comme je suis (dcidment) trop sympa, je vais vous
donner quelques indices pour vous aider avancer.
Avant toute chose, regardez la figure 9.1. Elle vous montre quoi ressemblera notre
Chat.
BESOIN DAIDE ?
gestion du Chat.
Voici un petit peu daide pour raliser chacun de ces fichiers. Si vous vous sentez
laise, honntement, essayez de vous en passer, cest encore mieux (et au pire revenez
lire cette section si jamais vous coincez).
package.json
ce stade, vous devriez savoir crer un package.json les yeux ferms. Je ne vais pas
vous rexpliquer la syntaxe, si vous avez un trou de mmoire je vous laisse retourner
la section5.
Par contre, ct modules externes, de quoi va-t-on avoir besoin ? Voil ce que je
suggre (et que jutilise dans ma correction) :
socket.io : si vous laviez oubli, vous tes impardonnables.
express : tant qu faire, autant utiliser Express.js ds le dbut. On ne sen
est pas servi dans le chapitre de dcouverte de socket.io mais il nest pas trs
compliqu utiliser en combinaison de socket.io. Dans le code web suivant, on
vous explique comment lutiliser en combinaison dExpress.js.
ent : un tout petit module qui permet de protger les chanes de caractres
envoyes par les visiteurs pour transformer le HTML en entits. Ce qui permet
dviter que vos visiteurs senvoient du code JavaScript dans le Chat !
"How to use" sur le site SoB cket.io
Code web : 456713
Honntement, Express.js et ent ne sont pas obligatoires pour faire fonctionner le
Chat. On peut trs bien faire sans, mais jai choisi de les utiliser dune part pour
faciliter la maintenance du code (pour Express.js) et dautre part pour la scurit
(pour ent).
app.js
Elle devra renvoyer une page web lorsquon appellera le serveur. vous donc de renvoyer un fichier index.html vos visiteurs qui se connectent sur votre site. Avec
Express.js, la syntaxe est un petit peu diffrente mais aussi plus courte.
En plus de la page web classique , votre serveur Node.js devra grer les vnements
de socket.io. A priori je dirais que lon a besoin de nen grer que deux :
nouveau_client (vous lappelez comme vous voulez) : signale quun nouveau
client vient de se connecter au Chat. Devrait transmettre son pseudo pour pouvoir informer les clients avec des messages comme robert a rejoint le Chat ! .
message : signale quun nouveau message a t post. Votre rle, en tant que
serveur, sera tout simplement de le redistribuer aux autres clients connects avec
un petit broadcast. Tant qu faire, vous rcuprerez le pseudo du posteur dans
une variable de session.
97
index.html
En fait, cest peut-tre le fichier qui demande le plus de travail et qui devrait vous donner (lgrement) du fil retordre. Vous allez devoir grer pas mal de code JavaScript
ct client.
Commencez par structurer une page HTML5 basique, avec un titre, un formulaire
compos dun champ de texte et dun bouton, et une <div> ou une <section> qui
contiendra les messages du Chat (par dfaut, elle sera vide).
vous ensuite dcrire le code JavaScript du client. Personnellement je lai plac
en bas de la page (pour des raisons de performances, cest une habitude prendre).
Jaurais aussi pu le mettre dans un fichier .js externe, mais je ne lai pas fait ici en
loccurrence.
Ce code devra :
Se connecter socket.io.
Demander le pseudo au visiteur lors du chargement de la page (via un prompt()
en JS, cest le plus simple que jaie trouv) et envoyer un signal nouveau_client.
Grer la rception de signaux de type nouveau_client envoys par le serveur.
Cela signifie quun nouveau client vient de se connecter. Affichez son nom dans
un message, comme par exemple Robert a rejoint le Chat ! .
Grer la rception de signaux de type message envoys par le serveur. Cela
signifie quun autre client vient denvoyer un message sur le Chat et donc quil
vous faut lafficher dans la page.
Grer lenvoi du formulaire lorsque le client veut envoyer un message aux autres
personnes connectes. Il vous faudra rcuprer le message saisi dans le formulaire en JavaScript, mettre un signal de type message au serveur pour quil le
distribue aux autres clients, et aussi insrer ce message dans votre propre page.
Eh oui, noubliez pas que le broadcast du serveur envoie un message toutes
les autres personnes connectes. . . except vous-mme. Il faut donc mettre
jour votre propre zone de Chat.
Je vous ai tellement prmch le travail que jen ai presque un coup de blues. . . Si vous
ny arrivez pas avec tout a. . . essayez plus fort !
Correction
Rien ne va plus, cest lheure de la correction !
Alors, comment sest passe la ralisation du Chat pour vous ? Vous ne devriez pas
avoir rencontr trop de problmes, ce TP tait une faon de reformuler un peu plus
proprement le chapitre prcdent dintroduction socket.io.
Mon projet est constitu de trois fichiers :
98
CORRECTION
package.json : la description du projet avec la liste de ses dpendances. Tout
projet Node.js qui se respecte en a un !
app.js : lapplication Node.js ct serveur qui gre les interactions avec les
diffrents clients.
index.html : la page web envoye au client qui contient du code JavaScript
pour grer le Chat ct client.
package.json
Notre package.json est trs simple :
1
2
3
4
5
6
7
8
9
10
11
Comme je vous le disais (pour ceux qui ont lu mes astuces daide juste avant), jutilise
videmment socket.io, mais aussi Express.js (bien que ce ne soit pas obligatoire) et
ent (pour faire appel une fonction quivalente htmlentities() de PHP, afin de
scuriser les changes et dviter que les clients ne senvoient des codes JavaScript
malicieux).
app.js
Relativement court, le code serveur du Chat ntait pas le fichier le plus difficile crire
de ce TP !
1
2
3
4
5
6
7
8
9
10
11
12
13
99
14
15
16
17
18
19
20
21
22
23
24
25
26
27
}) ;
28
29
index.html
OK, le code du client est un poil plus compliqu. Mais alors juste un poil honntement. Le voici tout de go, on le commente juste aprs, promis :
1
2
100
CORRECTION
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
< form action = " / " method = " post " id = " formulaire_chat " >
< input type = " text " name = " message " id = " message "
placeholder = " Votre message ... " size = " 50 "
autofocus / >
< input type = " submit " id = " envoi_message " value = "
Envoyer " / >
</ form >
22
23
24
25
26
27
28
29
< script src = " http :// code . jquery . com / jquery - 1 . 10 . 1 . min .
js " > </ script >
< script src = " / socket . io / socket . io . js " > </ script >
< script >
30
31
32
// Connexion socket . io
var socket = io . connect ( ' http :// localhost : 8080 ') ;
33
34
35
36
37
38
39
40
41
42
43
44
45
101
})
47
$ ( '# zone_chat ') . prepend ( ' <p > < em > ' + pseudo + '
a rejoint le Chat ! </ em > </p > ') ;
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
CORRECTION
Enfin, la fonction insereMessage() qui est ma foi trs simple. Elle rajoute le
message quon lui envoie avec le pseudo dans la zone de Chat, au dbut. La
fonction prepend() fait partie de jQuery, je ne linvente pas.
Jai choisi dutiliser jQuery dans mon code pour des raisons pratiques, mais vous
pouvez bien entendu faire tout a en pur JavaScript si vous en avez envie (ou avec
une autre bibliothque).
En fait, le code JavaScript ct client est peut-tre le plus gros. La partie Node.js
serveur est, comme vous le voyez, trs simple : on se connecte, on envoie des signaux,
on rcupre des signaux. . . et cest tout !
Tlcharger le projet
Vous avez tout le ncessaire prcdemment, mais si vous voulez vraiment un fichier .zip
tout prt, je vous propose de le tlcharger sur le code web suivant :
Tlcharger le fichier .zip
B
Code web : 647648
Petit rappel : il faut faire un npm install pour installer les dpendances
avant de lancer le projet avec node app.js !
103
104