Des Applications Ultra Rapides Avec Node.js

117

description

Des Applications Ultra Rapides Avec Node.js

Transcript of Des Applications Ultra Rapides Avec Node.js

  • Sauf mention contraire, le contenu de cet ouvrage est publi sous la licence :Creative Commons BY-NC-SA 2.0

    La copie de cet ouvrage est autorise sous rserve du respect des conditions de la licenceTexte complet de la licence disponible sur : http : //creativecommons.org/licenses/by-nc-sa/2.0/fr/

    OpenClassrooms 2014 - ISBN : 979-10-90085-61-9

    Mentions lgales :Conception couverture : Amalgam ImpressionIllustrations chapitres : Alexandra Persil

  • Avant-propos

    J avaScript est dcidment un langage tonnant. Lanc par Brendan Eich en 1995dans le navigateur Netscape pour permettre le dveloppement ct client (cest--dire lexcution de code sur la machine du visiteur), il est aujourdhui devenu unlangage incontournable du Web.

    Jusquici, JavaScript pouvait tre utilis uniquement du ct client... et voil que depuispeu 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 pourNode.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 lhabitudede voir. Tout est bas sur un systme dvnements qui lui permet dtre extrmementefficace, ce qui lui confre sa rputation de rapidit... et aussi une certaine complexitparfois, il faut bien lavouer !

    Mon but dans ce cours est de vous faire dcouvrir lutilisation de Node.js pas pasavec 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 plusprogressif possible et que vous preniez autant de plaisir que moi avec cette nouvellefaon de programmer !

    Quallez-vous apprendre en lisant ce livre ?

    Ce livre a t conu en partant du principe que vous connaissez dj le langage JavaS-cript. En effet, Node.js est directement bas sur JavaScript et il ne mest pas possiblede vous enseigner les deux la fois 1 ! Cependant, je ferai des rappels rgulirementpour les notions les plus dlicates.

    Voici les diffrentes parties qui jalonnent ce cours :

    1. Comprendre Node.js : cette premire partie sera loccasion de faire des rap-pels sur JavaScript, son histoire et la naissance de Node.js. Nous installeronsNode.js et nous crerons notre premire application pas pas ensemble ;

    1. Dautant plus quun excellent livre "Dynamisez vos sites web avec JavaScript" existe dj dansla mme collection !

    i

  • CHAPITRE 0. AVANT-PROPOS

    2. Structurer son application Node.js : ce sera le moment de rentrer plus enprofondeur dans le fonctionnement dune application Node.js. Nous parleronsdvnements, de modules et du framework Express.js, puis raliserons ensembleune todo list ;

    3. La communication temps rel avec socket.io : socket.io est lune des bi-bliothques les plus clbres de Node.js car elle permet une communication entemps rel dans les deux sens entre le client et le serveur. A la cl : nous seronscapables de raliser un vritable Chat temps rel en ligne !

    Comment lire ce livre ?

    Suivez lordre des chapitres

    Lisez ce cours comme on lit un roman. Il a t conu pour cela.

    Contrairement beaucoup de livres techniques o il est courant de lire en diagonale etde sauter certains chapitres, il est ici trs fortement recommand de suivre lordre ducours, moins que vous ne soyez dj un peu expriments.

    Pratiquez en mme temps

    Pratiquez rgulirement. Nattendez pas davoir fini de lire ce livre pour allumer votreordinateur et faire vos propres essais.

    Utilisez les codes web !

    Afin de tirer parti dOpenClassrooms dont ce livre est issu, celui-ci vous propose cequon appelle des codes web . Ce sont des codes six chiffres saisir sur une pagedOpenClassrooms pour tre automatiquement redirig vers un site web sans avoir en recopier ladresse.

    Pour utiliser les codes web, rendez-vous sur la page suivante :

    http://www.openclassrooms.com/codeweb

    Un formulaire vous invite rentrer votre code web. Faites un premier essai avec le codeci-dessous :

    B

    Tester le code webCode web : 123456

    Ces codes web ont deux intrts :

    ils vous redirigent vers les sites web prsents tout au long du cours, vous per-mettant ainsi dobtenir les logiciels dans leur toute dernire version ;

    ils vous permettent dafficher les codes sources inclus dans ce livre, ce qui vousvitera davoir recopier certains programmes un peu longs.

    ii

  • COMMENT LIRE CE LIVRE?

    Ce systme de redirection nous permet de tenir jour le livre que vous avez entre lesmains sans que vous ayez besoin dacheter systmatiquement chaque nouvelle dition.Si un site web change dadresse, nous modifierons la redirection mais le code web utiliser restera le mme. Si un site web disparat, nous vous redirigerons vers une pagedOpenClassrooms expliquant ce qui sest pass et vous proposant une alternative.

    En clair, cest un moyen de nous assurer de la prennit de cet ouvrage sans que vousayez faire quoi que ce soit !

    iii

  • CHAPITRE 0. AVANT-PROPOS

    iv

  • Table des matires

    Avant-propos i

    Comment lire ce livre ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ii

    Suivez lordre des chapitres . . . . . . . . . . . . . . . . . . . . . . . . . ii

    Pratiquez en mme temps . . . . . . . . . . . . . . . . . . . . . . . . . . ii

    Utilisez les codes web ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . ii

    I Comprendre Node.js 1

    1 Node.js : mais quoi a sert ? 3

    Du JavaScript la papa Node.js . . . . . . . . . . . . . . . . . . . . . . 4

    Node.js : le JavaScript ct serveur . . . . . . . . . . . . . . . . . . . . . . . . 5

    Pourquoi Node.js est-il rapide ? . . . . . . . . . . . . . . . . . . . . . . . . . . 7

    Le moteur V8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    Le modle non bloquant . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    2 Installer Node.js 13

    Installation de Node.js sous Windows . . . . . . . . . . . . . . . . . . . . . . 14

    Installation de Node.js sous Mac OS X . . . . . . . . . . . . . . . . . . . . . . 17

    Installation de Node.js sous Linux . . . . . . . . . . . . . . . . . . . . . . . . 19

    Tester Node.js avec un programme minimal . . . . . . . . . . . . . . . . . . . 20

    3 Une premire application avec Node.js 23

    Des serveurs web et des threads . . . . . . . . . . . . . . . . . . . . . . . . . . 24

    v

  • TABLE DES MATIRES

    Construire son serveur HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

    Dissquons du code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

    Tester le serveur HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

    Retourner du code HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

    Dterminer la page appele et les paramtres . . . . . . . . . . . . . . . . . . 31

    Quelle est la page demande par le visiteur ? . . . . . . . . . . . . . . . . 31

    Quels sont les paramtres ? . . . . . . . . . . . . . . . . . . . . . . . . . 33

    Schma rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

    II Structurer son application Node.js 35

    4 Les vnements 37

    couter des vnements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

    mettre des vnements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

    5 Les modules Node.js et NPM 43

    Crer des modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

    Utiliser NPM pour installer des modules . . . . . . . . . . . . . . . . . . . . . 46

    Trouver un module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

    Installer un module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

    Linstallation locale et linstallation globale . . . . . . . . . . . . . . . . 49

    Mettre jour les modules . . . . . . . . . . . . . . . . . . . . . . . . . . 50

    Dclarer et publier son module . . . . . . . . . . . . . . . . . . . . . . . . . . 50

    Le fonctionnement des numros de version . . . . . . . . . . . . . . . . . 51

    La gestion des versions des dpendances . . . . . . . . . . . . . . . . . . 52

    Publier un module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

    6 Le framework Express.js 55

    Les routes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

    Routes simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

    Routes dynamiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

    Les templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

    Les bases dEJS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    Plusieurs paramtres et des boucles . . . . . . . . . . . . . . . . . . . . . 60

    Aller plus loin : Connect et les middlewares . . . . . . . . . . . . . . . . . . . 61

    vi

  • TABLE DES MATIRES

    Express, connect et les middlewares . . . . . . . . . . . . . . . . . . . . 62

    Utiliser les fonctionnalits de Connect au sein dExpress . . . . . . . . . 64

    7 TP : la todo list 67

    Besoin daide ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

    Les modules et le package.json . . . . . . . . . . . . . . . . . . . . . . . 68

    Les routes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

    Bien chaner les appels aux middlewares . . . . . . . . . . . . . . . . . . 70

    Correction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

    La solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

    Les explications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

    Tlcharger le projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

    Allez plus loin ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

    III La communication temps rel avec socket.io 75

    8 socket.io : passez au temps rel ! 77

    Que fait socket.io ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

    mettre et recevoir des messages avec socket.io . . . . . . . . . . . . . . . . . 80

    Installer socket.io . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

    Premier code : un client se connecte . . . . . . . . . . . . . . . . . . . . 80

    Envoi et rception de messages . . . . . . . . . . . . . . . . . . . . . . . 83

    Communiquer avec plusieurs clients . . . . . . . . . . . . . . . . . . . . . . . 87

    Envoyer un message tous les clients (broadcast) . . . . . . . . . . . . . 87

    Les variables de session . . . . . . . . . . . . . . . . . . . . . . . . . . . 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

  • TABLE DES MATIRES

    Tlcharger le projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

    Allez plus loin ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

    viii

  • Premire partie

    Comprendre Node.js

    1

  • Chapitre1Node.js : mais quoi a sert ?

    Difficult :

    Et si on commenait par rpondre toutes ces questions qui vous taraudent :

    Pourquoi Node.js semble-t-il aussi apprci des dveloppeurs web ? Pourquoi avoir utilis un langage commeJavaScript ? Je croyais que ctait juste

    pour faire des effets dans sa page web ? Do vient cette rapidit suppose de Node.js ? quoi a peut me servir ? Est-ce que ce truc est mature ? Qui lutilise ( part des geeks barbus !) ? Devrais-je

    lutiliser moi aussi ?

    Je vais rpondre toute vos interrogations, et mme aux questions que vous ne vous posezpas, dans ce premier chapitre. Et si laventure vous tente, vous pourrez passer la suiteavec moi et installer Node.js sur votre machine !

    3

  • CHAPITRE 1. NODE.JS : MAIS QUOI A SERT?

    Du JavaScript la papa Node.js

    OK, lexpression JavaScript la papa est un peu forte, mais il y a du vrai l-dedans :JavaScript a eu plusieurs vies. Il a eu mauvaise presse. On la longtemps considrcomme un petit truc parfois bien pratique pour faire des effets sur sa page web .Or, JavaScript est avant tout un langage au mme titre que C, Ruby, PHP et biendautres.

    Dsormais, JavaScript est de retour et il prend sa revanche. Les dveloppeurs sont entrain de dcouvrir que ce langage quils ont longtemps ignor, parfois mme mpris,cache en fait bien son jeu.

    Non, JavaScript nest pas juste un petit langage utilitaire. Oui, JavaScript est unlangage part, qui sutilise vraiment diffremment de Java, du C et dun tas dautreslangages. Oui, JavaScript peut tre compliqu utiliser, mais recle une vritablepuissance.

    Alors que ce langage a t cr en 1995 (la prhistoire de linformatique, rendez-vouscompte !), il a depuis bien volu. Je vous invite (re)lire la petite histoire de Javascript,raconte par les compres Sbastien de la Marck et Johann Pardanaud dans leur coursintitul "Dynamisez vos sites web avec Javascript !" que vous retrouverez sur le sitedOpenclassrooms.

    Je vous disais que JavaScript tait un langage qui avait connu plusieurs vies. Pourtre plus prcis, je dirais mme quil a connu trois vies (comme lillustre la figure 1.1) :

    1. Dans les annes 90, on parlait de DHTML (Dynamic HTML). On utilisaiten fait les toutes premires versions de JavaScript pour crer des petits effetsdans ses pages web : afficher une image lors dun clic sur un bouton par exemple.Ctait lpoque de Netscape et dInternet Explorer 5.5.

    2. Dans les annes 2000, on a commenc utiliser le langage pour crer des inter-faces ct client. Cest l que des bibliothques comme jQuery ou Mootoolssont apparues. Aujourdhui, cet usage de JavaScript est trs rpandu et ma-ture. On a pris lhabitude de manipuler leDOM (Document Object Model) pouraffecter ses balises HTML en JavaScript et leur faire subir toutes sortes detraitements.

    3. Puis, aux alentours de 2010, JavaScript est entr dans une nouvelle re. Googlea commenc rendre le langage beaucoup plus rapide avec lapparition du na-vigateur Google Chrome. Avec ce navigateur est n le moteur dexcution V8qui a considrablement permis dacclrer lexcution de code JavaScript (jyreviendrai). Des outils comme Node.js sont ensuite apparus. Les bibliothquesdont le nom finit par .js se sont multiplies : Backbone.js, Ember.js, Me-teor.js. JavaScript a lair nouveau cool et semble en mme temps pluscompliqu quil ny parait au premier abord.

    Soyons clairs : jQuery nest pas mort et a ne veut pas dire quil faut cesser de lutiliser(par contre DHTML et Netscape sont bel et bien morts eux). Les nouveaux outilsJavaScript comme Node.js font des choses trs diffrentes de jQuery et consorts.Les deux peuvent tout fait se complter.

    4

  • NODE.JS : LE JAVASCRIPT CT SERVEUR

    Figure 1.1 Les trois vies de JavaScript

    Mais a apporte quoi concrtement Node.js ?

    Node.js nous permet dutiliser le langage JavaScript sur le serveur. . . Il nouspermet donc de faire du JavaScript en dehors du navigateur ! Node.js bnficie dela puissance de JavaScript pour proposer une toute nouvelle faon de dvelopper dessites web dynamiques.

    Je vous propose justement de rentrer maintenant dans le dtail du fonctionnement deNode.js.

    Node.js : le JavaScript ct serveur

    Jusquici, JavaScript avait toujours t utilis du ct du client, cest--dire du ctdu visiteur qui navigue sur notre site. Le navigateur web du visiteur (Firefox, Chrome,IE. . .) excute le code JavaScript et effectue des actions sur la page web. (Voir figure1.2)

    Quest-ce qui change avec larrive de Node.js ?

    On peut toujours utiliser du JavaScript ct client pour manipuler la page HTML.

    5

  • CHAPITRE 1. NODE.JS : MAIS QUOI A SERT?

    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 duti-liser le langage JavaScript pour gnrer des pages web. En gros, il vient en rempla-cement 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 !

    Pourquoi Node.js semble-t-il si diffrent ? Parce quil utilise JavaScript ?

    Oui, et parce que JavaScript est un langage bas sur les vnements, donc Node.jsest lui-mme bas sur les vnements. Du coup, cest toute la faon dcrire desapplications web qui change ! Cest de l que Node.js tire toute sa puissance et sarapidit.

    6

  • POURQUOI NODE.JS EST-IL RAPIDE?

    Avec Node.js, vous pouvez crer des applications rapides comme :

    Un serveur de Chat. Un systme dupload trs rapide. Et de faon gnrale, nimporte quelle application qui doit rpondre de nom-

    breuses requtes rapidement et efficacement, en temps rel.

    Node.js nest pas un framework. Node.js est un environnement trs basniveau. Il se rapproche donc en quelque sorte plus du C que de PHP, Ruby onRails ouDjango. Voil pourquoi il nest pas vraiment conseill aux dbutants.Notez cependant quil existe des frameworks web comme Express qui sontbass sur Node.js. Ils nous permettent dviter les tches rptitives qui noussont imposes par la nature bas niveau de Node.js, mais ils restent quandmme plus complexes utiliser que des langages comme PHP.

    JavaScript nest pas vraiment un langage Orient Objet, il est donc trs loin de Java,Ruby ou Python. crire une application avec Node.js demande une gymnastiquedesprit compltement diffrente ! Cest un peu droutant au dbut pour tout vousavouer, mais quand on commence matriser cet outil, on se sent un peu comme si onvenait davoir de nouveaux super-pouvoirs quon ne souponnait pas. Voil pourquoitant de geeks barbus sont excits propos de Node.js ! (Voir figure 1.4)

    Figure 1.4 Avant, jtais un barbu. . .

    Pourquoi Node.js est-il rapide ?

    Si Node.js est rapide, cela tient principalement deux choses : le moteur V8 et sonfonctionnement non bloquant.

    7

  • CHAPITRE 1. NODE.JS : MAIS QUOI A SERT?

    Le moteur V8

    Node.js utilise le moteur dexcution ultrarapide V8 de Google Chrome. Cemoteur V8 avait beaucoup fait parler de lui la sortie de Google Chrome, car cestun outil open source cr par Google qui analyse et excute du code JavaScript trsrapidement. (Voir figure 1.5)

    Figure 1.5 Le logo du moteur JavaScript V8 de Google

    Jusqu la sortie de Chrome, la plupart des navigateurs lisaient le code JavaScriptde faon peu efficace : le code tait lu et interprt au fur et mesure. Le navigateurmettait beaucoup de temps lire le JavaScript et le transformer en code machinecomprhensible pour le processeur.

    Le moteur V8 de Google Chrome, qui est rutilis ici par Node.js, fonctionne com-pltement diffremment. Trs optimis, il fait ce quon appelle de la compilation JIT(Just In Time). Il transforme le code JavaScript trs rapidement en code machineet loptimise mme grce des procds complexes : code inlining, copy elision etjen passe.

    Vous navez pas besoin de connatre le fonctionnement de V8 pour utiliser Node.js.Retenez juste quil permet de rendre lexcution de code JavaScript ultrarapide (etque les dveloppeurs chez Google qui lont conu sont de bons vrais barbus :- ).

    Le modle non bloquant

    Comme JavaScript est un langage conu autour de la notion dvnement, Node.jsa pu mettre en place une architecture de code entirement non bloquante. Mais au fait,connaissez-vous la diffrence entre un code bloquant et un code non bloquant ?Hmmm, un peu dexplication ne peut pas faire de mal !

    Modle bloquant vs modle non bloquant

    Imaginez un programme dont le rle est de tlcharger un fichier puis de lafficher.Voici comment on crirait le code dans un modle bloquant :

    1 Tlcharger un fichier2 Afficher le fichier3 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

  • POURQUOI NODE.JS EST-IL RAPIDE?

    3. Ensuite, le programme peut faire dautres choses (effectuer dautres actions).

    Maintenant, on peut crire le mme code sur un modle non bloquant :

    1 Tlcharger un fichier2 Ds que c'est termin, afficher le fichier3 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 figure1.6.

    Figure 1.6 Le modle non bloquant en programmation

    Cest justement comme a que fonctionne Node.js. Ds que lvnement Fichier t-lcharg apparat, une fonction appele fonction de callback est appele et effectuedes actions (ici, la fonction de callback affiche le fichier).

    Le modle non bloquant avec Node.js

    Et avec du vrai code a donne quoi ? Voici un exemple de programme Node.js quitlcharge un fichier sur Internet et affiche Fichier tlcharg ! quand il a termin :

    1 request('http ://www.site.com/fichier.zip', function (error ,response , body) {

    2 console.log("Fichier tlcharg !");

    9

  • CHAPITRE 1. NODE.JS : MAIS QUOI A SERT?

    3 });4 console.log("Je fais d'autres choses en attendant ...");

    La requte de tlchargement est lance en premier. Ensuite, le programme fait dautreschoses (ici, il affiche un message dans la console, mais il pourrait faire nimporte quoidautre). Ds que le tlchargement est termin, le programme va la ligne 2 et affiche Fichier tlcharg ! .

    Mais comment a marche ? Je vois une fonction en paramtre de la fonctionrequest ! Cest une fonction dans une fonction, au secours ces barbus sontfous !

    Pas de panique ! Ce que vous voyez l est une fonction de callback. En JavaScript,on peut tout fait envoyer une fonction en paramtre dune autre fonction. Cela signifieici : Excute cette fonction quand le tlchargement est termin.

    Ici, la fonction na pas de nom. On dit que cest une fonction anonyme. Mais onpourrait dcomposer ce code comme ceci, le rsultat serait identique :

    1 // Rsultat identique au code prcdent23 var callback = function (error , response , body) {4 console.log("Fichier tlcharg !");5 });67 request('http ://www.site.com/fichier.zip', callback);8 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 fonctionde callback en paramtre de la fonction request() pour dire : Ds que la requtede tlchargement est termine, appelle cette fonction de callback.

    En pratique, les dveloppeurs JavaScript mettent rgulirement des fonctions ano-nymes directement lintrieur dautres fonctions en paramtre, comme dans monpremier code. Cest un peu trange au dbut, mais on sy fait vite !

    Je ne vois pas pourquoi a rendrait le programme plus rapide. Jai limpressionque 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 deuxfichiers Node.js :

    1 var callback = function (error , response , body) {2 console.log("Fichier tlcharg !");3 });45 request('http ://www.site.com/fichier.zip', callback);

    10

  • POURQUOI NODE.JS EST-IL RAPIDE?

    6 request('http ://www.site.com/autrefichier.zip', callback);

    Si le modle avait t bloquant, le programme aurait :

    1. Lanc le tlchargement du fichier 1, et attendu quil se termine.2. Puis lanc le tlchargement du fichier 2, et attendu quil se termine.

    Or, avec Node.js, les deux tlchargements sont lancs en mme temps ! Le programmenattend pas la fin du premier tlchargement pour passer linstruction suivante.

    Du coup, le tlchargement des deux fichiers va beaucoup plus vite puisque le pro-gramme fait les deux la fois (voir figure 1.7) :

    Figure 1.7 En modle non bloquant (comme Node.js), les 2 fichiers sont tlchargsen mme temps et lensemble finit plus vite

    Dans les applications web, il est courant davoir des oprations longues et bloquantescomme :

    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 enattendant que les actions longues soient termines !

    En rsum Node.js est un environnement de dveloppement qui permet de coder ct ser-

    veur 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 particu-lire : tout est bas sur des vnements !

    Node.js est reconnu et apprci pour sa rapidit : un programme Node.jsnattend jamais inutilement sans rien faire !

    11

  • CHAPITRE 1. NODE.JS : MAIS QUOI A SERT?

    12

  • Chapitre2Installer Node.js

    Difficult :

    Vous tes convaincus ? Vous voulez vous mettre Node.js ? Trs bien ! Nattendons pas etinstallons la bte ! Dans ce chapitre, nous couvrirons linstallation pour Windows, Mac OSX 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.jsest bien install et fonctionne correctement. Je vous conseille de lire cette section si vousvoulez tre prts pour le prochain chapitre.

    13

  • CHAPITRE 2. INSTALLER NODE.JS

    Installation de Node.js sous Windows

    Pour installerNode.js sous Windows, il suffit de tlcharger linstalleur qui est propossur le code web suivant :

    B

    Site de Node.jsCode web : 435670 .

    Cliquez simplement sur le lien Install. Vous pouvez aussi vous rendre sur la page destlchargements pour avoir plus doptions (voir figure 2.7).

    Figure 2.1 La page de tlchargement de Node.js

    Vous pouvez tlcharger soit le .msi, soit le .exe (le rsultat sera le mme). Prenez laversion 64 bits si vous avez un Windows 64 bits (cas de la plupart des PC rcents).Dans le doute, prenez la version 32 bits.

    Lancez ensuite linstalleur (voir figure 2.2).

    Aprs quelques crans classiques, on vous demandera ce que vous voulez installer. Jevous invite tout laisser coch (voir figure 2.3).

    Linstallation se lance ensuite. Elle ne prend que quelques secondes ! la fin, on vousdit que Node.js est install (voir figure 2.4).

    Mais o ? Comment a marche ? En fait, vous devriez avoir deux programmes installs :

    14

  • INSTALLATION DE NODE.JS SOUS WINDOWS

    Figure 2.2 Installation de Node.js

    Figure 2.3 Choix des lments installer

    15

  • CHAPITRE 2. INSTALLER NODE.JS

    Figure 2.4 Linstallation est termine !

    Node.js : cest linterprteur de commandes de Node.js (dont nous par-lerons 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 pourreconnatreNode.js. Cest par l que vous passerez pour lancer vos programmesNode.js, cest donc ce que nous utiliserons le plus souvent. (Voir les figures 2.5et 2.6)

    Figure 2.5 Node.js - Linterprteur Node.js sous Windows (peu utilis)

    16

  • INSTALLATION DE NODE.JS SOUS MAC OS X

    Figure 2.6 Node.js command prompt - La console Node.js (frquemment utilise)

    Installation de Node.js sous Mac OS X

    Si vous tes sous Mac OS X, vous pouvez cliquer sur le lien Install grce au code websuivant (voir figure 2.7) :

    B

    Page daccueil de Node.jsCode web : 435670

    Si vous voulez plus doptions, affichez la page de tlchargement grce au code websuivant :

    B

    Page des tlchargementsCode web : 914330

    Le mieux est de prendre linstalleur (fichier .pkg). Il ouvre un assistant dinstalla-tion (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 correcte-ment en tapant la commande node dans la console. Ouvrez une fentre de Terminal (leTerminal 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 nodetout court pour lancer linterprteur interactif (voir figure 2.9).

    Lorsque linterprteur est lanc, vous pouvez taper des commandes JavaScript et ob-tenir une rponse. Ici, par exemple, jai demand combien font 1 et 1.

    Pour quitter linterprteur, faites Ctrl + D (cest la commande classique qui de-

    mande quitter un interprteur sous Linux et Mac).

    17

  • CHAPITRE 2. INSTALLER NODE.JS

    Figure 2.7 La page de tlchargement de Node.js

    Figure 2.8 Linstallation de Node.js sous Mac OS X

    18

  • INSTALLATION DE NODE.JS SOUS LINUX

    Figure 2.9 Excution de Node.js dans le Terminal

    Rassurez-vous, nous ncrirons pas nos programmes Node.js l-dedans ! Celanous sert ici surtout pour faire des tests. En pratique, nous allons crire desfichiers .js et demander Node de les excuter. Nous verrons a un peu plusloin.

    Installation de Node.js sous Linux

    Sous Linux, comme dhabitude, vous avez deux choix :

    1. La mthode warrior , qui consiste tlcharger les sources et les compiler.

    2. La mthode douce, qui consiste utiliser le gestionnaire de paquets de sa dis-tribution.

    L, cest une question de got. Je nai rien contre la mthode warrior , mais commejai en gnral moins de problmes de configuration avec la mthode douce, je prfrepasser par un gestionnaire de paquets.

    Sous Ubuntu par exemple, vous devrez rentrer les commandes suivantes :

    sudo apt -get install python -software -properties python g++ makesudo add -apt -repository ppa:chris -lea/node.jssudo apt -get updatesudo apt -get install nodejs

    Pour avoir la commande add-apt-repository il vous faudra peut-tre tlchargersoftware-properties-common : sudo apt-get install software-properties-common.

    19

  • CHAPITRE 2. INSTALLER NODE.JS

    Et voil le travail ! Pour vrifier que Node est bien install, tapez quelques commandesdans la console comme :

    node -vnode

    La premire affiche le numro de version de Node.js que vous avez install. La secondelance linterprteur interactif de Node.js. Vous pouvez y taper du code JavaScript(essayez simplement de taper 1+1 pour voir). Pour sortir de linterprteur, faitesCtrl + D.

    Rassurez-vous, nous ncrirons pas nos programmes dans linterprteur interactif. Nouscrerons plutt des fichiers .js et demanderons Node de les excuter.

    Depuis les versions les plus rcentes de Node.js, il faut savoir que NPMest install en mme temps automatiquement. NPM est le gestionnaire depaquets deNode.js (cest un peu lquivalent de apt, mais pour les extensionsNode.js). NPM est vraiment un outil formidable qui nous permet dtendreles possibilits de Node.js linfini, nous le dcouvrirons un peu plus tard.

    Tester Node.js avec un programme minimal

    Il est temps de vrifier que Node.js fonctionne bien ! Pour commencer, nous allonscrire un tout petit programme qui se contente dafficher un message dans la console.Ce sera loccasion de voir comment fonctionne lexcution de fichiers .js avec Node.

    Pour commencer, ouvrez votre diteur de texte favori (vim, Emacs, Sublime Text,Notepad++. . .) et rentrez le code JavaScript suivant :

    1 console.log('Bienvenue dans Node.js !');

    Enregistrez votre fichier sous lextension .js. Par exemple test.js. Ensuite, ouvrez uneconsole dans le dossier o se trouve votre fichier test.js et entrez la commande nodetest.js. Vous devriez avoir le rsultat suivant dans la console :

    $ node test.jsBienvenue dans Node.js !

    Bravo, vous avez cr votre tout premier programme Node.js ! Ctait vraiment ce quelon pouvait faire de plus simple. On a simplement demand crire un message dansla console.

    Vous avez vu que pour lancer un programme Node.js, il suffisait dindiquer le nom dufichier .js excuter. Vous savez tout ce quil faut savoir pour le moment !

    Dans le prochain chapitre, nous attaquerons les choses srieuses : nous allons crernotre premire vraie application Node.js. Attention, a va se corser !

    20

  • TESTER NODE.JS AVEC UN PROGRAMME MINIMAL

    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

  • CHAPITRE 2. INSTALLER NODE.JS

    22

  • Chapitre3Une premire application avec Node.js

    Difficult :

    Les choses srieuses commencent ! Fini de rire, nous entrons maintenant dans le vif dusujet. Ceci est lun des chapitres les plus importants du cours car il introduit de nombreuxconcepts de Node.js qui seront, pour la plupart, nouveaux pour vous. Il faudra donc lirece chapitre dans un environnement calme, progressivement, et ne pas hsiter le lire uneseconde fois le lendemain pour vous assurer que vous avez bien compris.

    Dans ce chapitre, nous allons crer une vritable application Node.js de bout en bout.Vous allez voir ce que bas niveau veut dire ! Nous allons en effet devoir grer tous lesrouages du serveur web qui va traiter les requtes HTTP des visiteurs et leur retournerune page web HTML.

    Ce sera pour vous loccasion dexprimenter les fameux callbacks dont je vous avais parldans le premier chapitre, ces fonctions qui sexcutent ds lors quun vnement survient.Node.js en est rempli, vous ne pourrez pas y chapper !

    23

  • CHAPITRE 3. UNE PREMIRE APPLICATION AVEC NODE.JS

    Des serveurs web et des threads

    Je crois vous lavoir dj dit plusieurs fois, mais jai envie de le rpter une nouvellefois ici : Node.js est bas niveau. Tellement bas niveau que vous allez devoir faire deschoses que vous navez pas lhabitude de faire pour que votre programme fonctionnecorrectement.

    Quand vous crez des sites web avec PHP par exemple, vous associez le langage avecun serveur web HTTP comme Apache ou Nginx. Chacun se rpartit les rles :

    Apache gre les demandes de connexion HTTP au serveur. Cest lui qui fait enquelque sorte la circulation et qui gre les entres/sorties.

    PHP excute le code des fichiers .php et renvoie le rsultat Apache, qui secharge son tour de lenvoyer au visiteur.

    Comme plusieurs visiteurs peuvent demander une page en mme temps au serveur,Apache se charge de les rpartir et de les excuter en parallle dans des threadsdiffrents. Chaque thread utilise un processeur diffrent sur le serveur (ou un noyaude processeur) (voir figure 3.1) :

    Figure 3.1 Le serveur Apache est multithread

    Avec Node.js, on nutilise pas de serveur web HTTP comme Apache. En fait, cest nous de crer le serveur ! Gnial non ?

    Node.js est monothread, contrairement Apache. Cela veut dire quil ny a quunseul processus, une seule version du programme qui peut tourner la fois en mmoire.

    Mais je croyais que Node.js tait trs rapide parce quil pouvait grer destonnes de requtes simultanes. Sil est monothread, il ne peut faire quuneaction la fois non ?

    En effet, il ne peut faire quune chose la fois et ne tourne donc que sur un noyau deprocesseur. Mais il fait a de faon ultra efficace, et malgr cela, il est quand mme

    24

  • CONSTRUIRE SON SERVEUR HTTP

    beaucoup plus rapide ! Cela est d la nature oriente vnements de Node.js. Lesapplications utilisant Node ne restent jamais les bras croiss sans rien faire. Ds quily a une action un peu longue, le programme donne de nouveau la main Node.js quiva effectuer dautres actions en attendant quun vnement survienne pour dire quelopration est termine. (Voir figure 3.2)

    Figure 3.2 Node.js est monothread, mais il est souple grce aux vnements

    Construire son serveur HTTP

    Je vous propose dentrer dans le vif du sujet avec ce tout premier code Node.js :1 var http = require('http');23 var server = http.createServer(function(req , res) {4 res.writeHead(200);5 res.end('Salut tout le monde !');6 });7 server.listen(8080);

    Cest en quelque sorte le code minimal pour un projet Node.js. Placez-le dans unfichier que vous appellerez serveur.js (par exemple).

    Que fait ce code ?

    Il cre un mini-serveur web qui renvoie un message Salut tout le monde dans tous lescas, quelque soit la page demande. Ce serveur est lanc sur le port 8080 la dernireligne.

    25

  • CHAPITRE 3. UNE PREMIRE APPLICATION AVEC NODE.JS

    Dissquons du code

    Dcomposons le code :1 var http = require('http');

    require effectue un appel une bibliothque de Node.js, ici la bibliothque http qui nous permet de crer un serveur web. Il existe des tonnes de bibliothques commecelle-l, la plupart pouvant tre tlcharges avec NPM, le gestionnaire de paquets deNode.js (nous apprendrons lutiliser plus tard).

    La variable http reprsente un objet JavaScript qui va nous permettre de lancer unserveur web. Cest justement ce quon fait avec :1 var server = http.createServer ();

    On appelle la fonction createServer() contenue dans lobjet http et on enregistre ceserveur dans la variable server. Vous remarquerez que la fonction createServer prendun paramtre. . . et que ce paramtre est une fonction ! Cest pour a que linstructionest un peu complique, puisquelle stend sur plusieurs lignes :1 var server = http.createServer(function(req , res) {2 res.writeHead(200);3 res.end('Salut tout le monde !');4 });

    Tout ce code correspond lappel createServer(). Il comprend en paramtre lafonction excuter quand un visiteur se connecte notre site.

    Notez que vous pouvez faire a en deux temps comme je vous lavais dit. La fonction excuter est la fonction de callback. On peut la dfinir avant dans une variableet transmettre cette variable createServer(). Ainsi, le code suivant est strictementidentique au prcdent :1 // Code identique au prcdent23 var instructionsNouveauVisiteur = function(req , res) {4 res.writeHead(200);5 res.end('Salut tout le monde !');6 }78 var server = http.createServer(instructionsNouveauVisiteur);

    Il est trs important que vous compreniez ce principe, car Node.js ne fonctionne quecomme 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 premiercode. 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 lesparenthses 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

  • CONSTRUIRE SON SERVEUR HTTP

    1. La requte du visiteur (req dans mes exemples) : cet objet contient toutes lesinformations sur ce que le visiteur a demand. On y trouve le nom de la pageappele, les paramtres, les ventuels champs de formulaires remplis.

    2. La rponse que vous devez renvoyer (res dans mes exemples) : cest cet objetquil faut remplir pour donner un retour au visiteur. Au final, res contiendraen gnral le code HTML de la page renvoyer au visiteur.

    Ici, on effectue deux choses trs simples dans la rponse :

    1 res.writeHead(200);2 res.end('Salut tout le monde !');

    On renvoie le code 200 dans len-tte de la rponse, qui signifie au navigateur OKtout va bien (on aurait par exemple rpondu 404 si la page demande nexistait pas).Il faut savoir quen plus du code HTML, le serveur renvoie en gnral tout un tas deparamtres en en-tte. Il faut connatre la norme HTTP qui indique comment clientset serveurs doivent communiquer pour bien lutiliser. Voil encore un exemple de lacomplexit due au fait que Node.js est bas niveau. Mais en mme temps, cela nousfait comprendre tout un tas de choses.

    Ensuite, on termine la rponse (avec end()) en envoyant le message de notre choix aunavigateur. Ici, on nenvoie mme pas de HTML, juste du texte brut.

    Enfin, le serveur est lanc et coute sur le port 8080 avec linstruction :

    1 server.listen(8080);

    On vite dutiliser ici le port 80 qui est normalement rserv aux serveurs webcar celui-ci est peut-tre dj utilis par votre machine. Ce port 8080 sertjuste pour nos tests videmment, une fois en production il est conseill aucontraire dcouter cette fois sur le port 80, car cest cette porte ( ce port)que vos visiteurs iront taper en arrivant sur votre serveur.

    Tester le serveur HTTP

    Pour tester votre premier serveur, rendez-vous dans la console et tapez :

    node serveur.js

    La console naffiche rien et ne rpond pas, ce qui est parfaitement normal. Ouvrez main-tenant votre navigateur et rendez-vous ladresse http://localhost:8080. Vous allezvous connecter sur votre propre machine sur le port 8080 sur lequel votre programmeNode.js est en train dcouter ! Vous devriez obtenir quelque chose ressemblant lafigure 3.3.

    Pour arrter votre serveur Node.js, retournez dans la console et faites Ctrl + C

    pour couper la commande.

    27

  • CHAPITRE 3. UNE PREMIRE APPLICATION AVEC NODE.JS

    Figure 3.3 Notre premier programme Node.js saffiche dans le navigateur !

    Retourner du code HTML

    Rsumons ! Nous avons cr notre premire vritable application avec son serveur webembarqu. Mais lapplication est pour linstant minimaliste :

    Le message renvoy est du texte brut, il ne comporte mme pas de HTML ! Lapplication renvoie toujours le mme message, quelle que soit la page appele

    (http://localhost:8080, http://localhost:8080/mapage,http://localhost:8080/dossier/autrepage).

    Pour que ce chapitre soit complet, nous allons voir comment remdier ces deuxproblmes. Commenons ici par voir comment faire pour renvoyer du HTML.

    Comme je vous lai dit, il y a des rgles respecter entre le client et le serveur. Ilscommuniquent en se basant sur la norme HTTP invente par Tim Berners-Lee. Cettenorme est la base du web (tout comme le langage HTML qui a aussi t inventpar ce mme monsieur).

    Que dit la norme HTTP ? Que le serveur doit indiquer le type de donnes quilsapprte envoyer au client. Et oui, un serveur peut renvoyer diffrents types dedonnes :

    Du texte brut : text/plain. Du HTML : text/html. Du CSS : text/css. Une image JPEG : image/jpeg. Une vido MPEG4 : video/mp4. Un fichier ZIP : application/zip. Etc.

    Ce sont ce quon appelle les types MIME. Ils sont envoys dans len-tte de la rponsedu serveur. Vous vous souvenez comment on crit dans len-tte de la rponse avecNode.js ? Nous avions crit ceci :

    1 res.writeHead(200);

    28

  • RETOURNER DU CODE HTML

    Nous avions seulement indiqu le code de rponse 200 qui signifie OK, pas derreur .Nous devons rajouter un paramtre qui indique le type MIME de la rponse. PourHTML, ce sera donc :

    1 res.writeHead(200 , {"Content -Type": "text/html"});

    Le second paramtre est entre accolades, car on peut y envoyer plusieursvaleurs sous forme de tableau.

    Maintenant que cest fait, nous pouvons renvoyer du HTML dans la rponse !

    1 res.end('Voici un paragraphe HTML !');

    Au final, notre code ressemble donc maintenant ceci :

    1 var http = require('http');23 var server = http.createServer(function(req , res) {4 res.writeHead(200 , {"Content -Type": "text/html"});5 res.end('Voici un paragraphe HTML !

    ');6 });7 server.listen(8080);

    Essayez-le comme vous lavez appris, en lanant lapplication avec la commande nodedans la console et en ouvrant votre navigateur sur http://localhost:8080 (voir figure3.4).

    Figure 3.4 Un paragraphe HTML renvoy par notre appli Node.js

    Votre paragraphe de texte saffiche et est bien mis en forme comme prvu !

    Mais le code HTML nest pas valide non ? On na pas crit de doctype, ni labalise , ni la balise .

    Grmpf, vous mavez pris la main dans le sac ! Un code HTML invalide, jai honte.Rparons a ! Cest facile, il suffit denvoyer toutes les autres balises qui manquent.

    29

  • CHAPITRE 3. UNE PREMIRE APPLICATION AVEC NODE.JS

    Jusquici, nous avions toujours crit le code HTML dans res.end(). Pourmieux dcouper le code, partir de maintenant, jutilise la commanderes.write() qui permet dcrire la rponse en plusieurs temps. a revientau mme, mais notre code est mieux dcoupl comme a. res.end() doittoujours tre appel en dernier pour terminer la rponse et faire en sorte quele serveur envoie le rsultat au client.

    1 var http = require('http');23 var server = http.createServer(function(req , res) {4 res.writeHead(200 , {"Content -Type": "text/html"});5 res.write(''+6 ''+7 ' '+8 ' '+9 ' Ma page Node.js !'+10 ' '+11 ' '+12 ' Voici un paragraphe HTML !'+13 ' '+14 '');15 res.end();16 });17 server.listen(8080);

    Mais cest atroce dcrire du HTML comme a !

    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 webHTML complexes comme a l-dedans. Il existe des moyens de sparer le code HTMLdu code JavaScript : ce sont les systmes de templates. Cest un peu hors sujetpour le moment, tant donn que nous commenons tout juste dcouvrir les basesde Node.js. Mais si le sujet vous intresse, sachez quil existe des tonnes de modules(voir le code web suivant) :

    B

    Des modules Node.js ddisaux templatesCode web : 272512

    Le choix est immense !

    30

  • DTERMINER LA PAGE APPELE ET LES PARAMTRES

    Dterminer la page appele et les paramtres

    Nous savons renvoyer du code HTML, mais pour le moment notre application renvoietoujours la mme chose ! Comment fait-on pour crer diffrentes pages avec Node.js ?Essayez notre petite application sur diffrentes URL. Quelque soit la page appele, lapage qui saffiche est toujours la mme !

    Il faut quon sache quelle est la page demande par le visiteur. Pour linstant, vu quenous ne faisons aucun test, notre application renvoie toujours la mme chose.

    Nous allons dcouvrir comment rcuprer :

    Le nom de la page demande (/mapage, /page.html, /dossier/autrepage. . .). Les paramtres qui circulent dans lURL.

    Quelle est la page demande par le visiteur ?

    Pour rcuprer la page demande par le visiteur, on va faire appel un nouveau modulede Node appel url . On demande son inclusion avec :1 var url = require("url");

    Ensuite, il nous suffit de parser la requte du visiteur comme ceci pour obtenir lenom de la page demande :1 url.parse(req.url).pathname;

    Voici un code trs simple qui nous permet de tester a :1 var http = require('http');2 var url = require('url');34 var server = http.createServer(function(req , res) {5 var page = url.parse(req.url).pathname;6 console.log(page);7 res.writeHead(200 , {"Content -Type": "text/plain"});8 res.write('Bien le bonjour ');9 res.end();10 });11 server.listen(8080);

    Excutez ce script et lancez votre navigateur ladresse http://localhost:8080 pourcommencer. Retournez ensuite dans la console. Nous y loggons le nom de la pagedemande. Vous devriez y voir :

    //favicon.ico

    Je nai charg que la page daccueil, pourquoi est-ce que je vois /favicon.ico ?

    31

  • CHAPITRE 3. UNE PREMIRE APPLICATION AVEC NODE.JS

    La plupart des navigateurs font en ralit une seconde requte pour rcuprer licnedu site (la favicon quon voit dans les onglets en gnral). Cest normal, ne vous enproccupez pas.

    Essayez maintenant de charger de fausses pages de votre site pour voir ce que afait.

    /testpage/favicon.ico/un/long/chemin//favicon.ico/faussepage.html/favicon.ico

    Si on omet les favicon.ico qui viennent un peu polluer la console, on voit que jai essayde 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 :

    B

    Page faussepageCode web : 528764

    Et alors ? Mon site renvoie toujours la mme chose quelle que soit la pageappele !

    En effet. Mais il suffit dcrire une condition, et le tour est jou !

    1 var http = require('http');2 var url = require('url');34 var server = http.createServer(function(req , res) {5 var page = url.parse(req.url).pathname;6 console.log(page);7 res.writeHead(200 , {"Content -Type": "text/plain"});8 if (page == '/') {9 res.write('Vous tes l\'accueil , que puis -je pour

    vous ?');10 }11 else if (page == '/sous -sol') {12 res.write('Vous tes dans la cave vins , ces

    bouteilles sont moi !');13 }14 else if (page == '/etage/1/chambre ') {15 res.write('H ho , c\'est priv ici !');16 }17 res.end();

    32

  • DTERMINER LA PAGE APPELE ET LES PARAMTRES

    18 });19 server.listen(8080);

    Allez un petit dfi pour vous entraner : faites en sorte dafficher un message derreur sile visiteur demande une page inconnue. Et noubliez pas de renvoyer un code derreur404 !

    Quels sont les paramtres ?

    Les paramtres sont envoys la fin de lURL, aprs le chemin du fichier. Prenez cetteURL par exemple : http://localhost:8080/page?prenom=Robert&nom=Dupont.

    Les paramtres sont contenus dans la chane ?prenom=Robert&nom=Dupont. Pour rcu-prer cette chane, il suffit de faire appel :

    1 url.parse(req.url).query

    Le problme, cest quon vous renvoie toute la chane sans dcouper au pralable lesdiffrents paramtres. Heureusement, il existe un moduleNode.js qui sen charge pournous : querystring !

    Incluez ce module :

    1 var querystring = require('querystring ');

    Vous pourrez ensuite faire :

    1 var params = querystring.parse(url.parse(req.url).query);

    Vous disposerez alors dun tableau de paramtres params. Pour rcuprer le paramtreprenom par exemple, il suffira dcrire : params[prenom].

    Amusons-nous avec un code complet qui affiche votre prnom et votre nom (pourvuque ceux-ci soient dfinis !) :

    1 var http = require('http');2 var url = require('url');3 var querystring = require('querystring ');45 var server = http.createServer(function(req , res) {6 var params = querystring.parse(url.parse(req.url).query);7 res.writeHead(200 , {"Content -Type": "text/plain"});8 if ('prenom ' in params && 'nom' in params) {9 res.write('Vous vous appelez ' + params['prenom '] + ' '

    + params['nom']);10 }11 else {12 res.write('Vous devez bien avoir un prnom et un nom ,

    non ?');13 }14 res.end();15 });16 server.listen(8080);

    33

  • CHAPITRE 3. UNE PREMIRE APPLICATION AVEC NODE.JS

    Essayez daller sur http://localhost:8080?prenom=Robert&nom=Dupont pour voir,puis changez le prnom et le nom pour les remplacer par les vtres !

    Deux petites prcisions par rapport ce code : prenom in params mepermet en JavaScript de tester si le tableau contient bien une entreprenom. Sil manque un paramtre, je peux alors afficher un message der-reur (sinon mon script aurait affich undefined la place). Par ailleurs,vous constaterez que je ne vrifie pas la page qui est appele. Ce codefonctionne aussi bien que lon soit sur http://localhost:8080 ou surhttp://localhost:8080/pageimaginaire. Il faudrait combiner ce codeet le prcdent pour grer la fois la page et les paramtres.

    Schma rsum

    Rsumons ce que nous venons dapprendre dans un seul et unique schma (voir figure3.5) avant de terminer.

    Figure 3.5 Rcuprer lURL et les paramtres avec Node.js

    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 nomde la page demande et ses paramtres pour savoir ce quelle doit renvoyer auvisiteur.

    Les bibliothque de Node.js sont appeles des modules et on les charge avecrequire()

    AvecNode.js, on envoie frquemment des fonctions en paramtre dautres fonc-tions. Cela permet dindiquer la fonction suivante appeler lorsquune tche esttermine.

    Votre application devra gnralement renvoyer du HTML au navigateur duvisiteur avec la mthode write().

    34

  • Deuxime partie

    Structurer son applicationNode.js

    35

  • Chapitre4Les 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 maisaucune opration nest bloquante. Ainsi, les oprations un peu longues (chargement dunfichier, tlchargement dune page web, dmarrage dun serveur web. . .) sont lances entche 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 maisaussi un peu plus difficile apprhender puisque il nous impose de coder avec beaucoup defonctions de callback. Je vous propose de rentrer ici dans les dtails du fonctionnementdes 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

  • CHAPITRE 4. LES VNEMENTS

    couter des vnements

    Surprise ! Vous savez dj couter des vnements en JavaScript. Vous nallez pasme faire croire que vous navez jamais utilis une bibliothque comme jQuery pourcouter des vnements sur votre page web !

    Par exemple :1 $("canvas").on("mouseleave", function () { ... });

    Avec ce genre dinstruction, vous demandez excuter une fonction de callbackquand la souris sort dun lment de la page. On dit que vous attachezlvnement au DOM de la page.

    Avec Node.js, le principe est exactement le mme. Un trs grand nombre dobjetsNode.js mettent des vnements. Leur particularit ? Ils hritent tous dun objetEventEmitter fourni par Node.

    Prenons par exemple le module http que nous avons utilis pour crer notre serveurweb. Il comprend un objet Server qui met des vnements. La figure 4.1 est un extraitdu document que vousretrouverez grce au code web suivant :

    B

    La docCode web : 438864

    Figure 4.1 La doc de Node.js indique les vnements que les objets mettent

    Comment couter ces vnements ? Supposons par exemple quon souhaite couterlvnement close qui survient quand le serveur est arrt. Il suffit de faire appel lamthode on() et dindiquer :

    Le nom de lvnement que vous coutez (ici close). La fonction de callback appeler quand lvnement survient.

    Exemple :1 server.on('close', function () {2 // Faire quelque chose quand le serveur est arrt3 })

    38

  • COUTER DES VNEMENTS

    Je vous propose un exemple concret et complet. On va lancer un serveur et larrterjuste aprs. On coute lvnement close qui survient lorsque le serveur est arrt. Onaffiche un message dans la console quand le serveur sapprte sarrter.

    1 var http = require('http');23 var server = http.createServer(function(req , res) {4 res.writeHead(200);5 res.end('Salut tout le monde !');6 });78 server.on('close', function () { // On coute l'vnement close9 console.log('Bye bye !');10 })1112 server.listen(8080); // Dmarre le serveur1314 server.close(); // Arrte le serveur. Dclenche l'vnement

    close

    Mais au fait. . . createServer() comprend une fonction de callback lui aussi.Pourquoi on nutilise pas on() ici ?

    Bien vu ! En fait, cest une contraction de code. Lisez la section "CreateServer" surla doc indique sur le code web prcdent. Elle dit que la fonction de callback quonlui envoie en paramtre est automatiquement ajoute lvnement request !

    Donc ce code :

    1 var server = http.createServer(function(req , res) { });

    . . . peut tre rcrit comme ceci de faon plus dtaille :

    1 // Code quivalent au prcdent2 var server = http.createServer ();3 server.on('request ', function(req , res) { });

    Bref, les vnements sont partout, vous ne pouvez pas y chapper ! Certains sontsimplement un peu masqus comme cest le cas ici, mais il est important de savoirce qui se passe derrire.

    Vous pouvez couter plusieurs fois un mme vnement. Faites deux foisappel la fonction on() pour le mme vnement : les deux fonctions decallback seront appeles quand lvnement aura lieu.

    39

  • CHAPITRE 4. LES VNEMENTS

    mettre des vnements

    Si vous voulez mettre des vnements vous aussi, cest trs simple : incluez lemodule EventEmitter et crez un objet bas sur EventEmitter.1 var EventEmitter = require('events ').EventEmitter;23 var jeu = new EventEmitter ();

    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 lechoisir.

    Un ou plusieurs ventuels paramtres passer (facultatif).

    Ici, je gnre un vnement gameover et jenvoie un message celui qui rceptionneralvnement via un paramtre :1 jeu.emit('gameover ', 'Vous avez perdu !');

    Celui qui veut couter lvnement doit ensuite faire :1 jeu.on('gameover ', function(message) { });

    Voici un code complet pour tester lmission dvnements :1 var EventEmitter = require('events ').EventEmitter;23 var jeu = new EventEmitter ();45 jeu.on('gameover ', function(message){6 console.log(message);7 });89 jeu.emit('gameover ', 'Vous avez perdu !');

    Je ladmets, cest un peu trop simple. Ce code se contente dmettre un vnement.Dans la ralit, les vnements seront mis depuis des fonctions imbriques dansdautres fonctions, cest de l que Node.js tire toute sa richesse.

    Comme vous le voyez, le principe nest pas franchement compliqu comprendre !

    Noubliez pas que vous pouvez envoyer autant de paramtres que ncessaire la fonc-tion de callback. mettez simplement plus de paramtres :1 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

  • METTRE DES VNEMENTS

    Avec la mthode on(), vous pouvez couter un vnement et indiquer quellefonction doit tre appele lorsque lvnement survient.

    Avec la mthode emit() vous pouvez crer votre propre vnement et doncprovoquer le dclenchement des fonctions qui attendent cet vnement.

    41

  • CHAPITRE 4. LES VNEMENTS

    42

  • Chapitre5Les modules Node.js et NPM

    Difficult :

    Croyez-le ou non, le noyau de Node.js est tout petit. A la base, Node.js ne sait en fait pasfaire grand chose. Pourtant, Node.js est trs riche grce son extensibilit. Ces extensionsde Node.js sont appeles modules.

    Il existe des milliers de modules qui offrent des fonctionnalits varies : de la gestion desfichiers uploads la connexion aux bases de donnes MySQL ou Redis, en passantpar des frameworks, des systmes de templates et la gestion de la communication tempsrel avec le visiteur ! Il y a peu prs tout ce dont on peut rver et de nouveaux modulesapparaissent chaque jour.

    Nous allons commencer par voir comment sont grs les modules par Node.js et nousverrons que nous pouvons facilement en crer un nous aussi. Puis, nous dcouvrirons NPM(Node Package Manager), loutil indispensable qui vous permet de tlcharger facilementtous les modules de la communaut Node.js ! Enfin, je vous montrerai comment accder la gloire ternelle en publiant votre module sur NPM.

    43

  • CHAPITRE 5. LES MODULES NODE.JS ET NPM

    Crer des modules

    Vous souvenez-vous de cette ligne ?

    1 var http = require('http');

    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 appelhttp.js. De mme, si on demande le module url , Node.js va rechercher un fichierappel url.js.

    1 var http = require('http'); // Fait appel http.js2 var url = require('url'); // Fait appel url.js

    O sont ces fichiers .js ? Je ne les vois pas !

    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 dossieret y faire appel comme ceci :

    1 var test = require('./test'); // Fait appel test.js (mmedossier)

    Il ne faut pas mettre lextension .js dans le require() !

    Cest un chemin relatif. Si le module se trouve dans le dossier parent, nous pouvonslinclure comme ceci :

    1 var test = require('../ test'); // Fait appel test.js (dossierparent)

    Et si je ne veux pas mettre de chemin relatif ? Je ne peux pas juste fairerequire(test) ?

    Si vous pouvez ! Il faut mettre votre fichier test.js dans un sous-dossier appelnode_modules. Cest une convention de Node.js :

    1 var test = require('test'); // Fait appel test.js (sous -dossier node_modules)

    44

  • CRER DES MODULES

    La figure 5.1 rsume tout a.

    Figure 5.1 Node.js sait o chercher les modules

    Notez que si le dossier node_modules nexiste pas, Node.js ira chercher un dossier quia le mme nom plus haut dans larborescence. Ainsi, si votre projet se trouve dans ledossier : /home/mateo21/dev/nodejs/projet, il ira chercher un dossier nomm :

    /home/mateo21/dev/nodejs/projet/node_modules, et si ce dossier nexistepas il ira le chercher dans. . .

    . . . /home/mateo21/dev/nodejs/node_modules, et si ce dossier nexiste pas ilira le chercher dans. . .

    . . . /home/mateo21/dev/node_modules, et ainsi de suite !

    quoi ressemble le code des fichiers .js des 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 quedautres personnes puissent rutiliser.

    Testons cela ! Nous allons crer un module tout bte qui sait dire Bonjour ! et Byebye ! . Crez un fichier monmodule.js avec le code suivant :

    1 var direBonjour = function () {2 console.log('Bonjour !');3 }

    45

  • CHAPITRE 5. LES MODULES NODE.JS ET NPM

    45 var direByeBye = function () {6 console.log('Bye bye !');7 }89 exports.direBonjour = direBonjour;10 exports.direByeBye = direByeBye;

    Le dbut du fichier ne contient rien de nouveau. Nous crons des fonctions que nousplaons dans des variables. Do le var direBonjour = function().

    Ensuite, et cest la nouveaut, nous exportons ces fonctions pour quelles soient utili-sables de lextrieur : exports.direBonjour = direBonjour;. Notez dailleurs quonaurait aussi pu faire directement :

    1 exports.direBonjour = function () { ... };

    Toutes les fonctions que vous nexportez pas dans votre fichier de moduleresteront prives. Elles ne pourront pas tre appeles de lextrieur. En re-vanche, elles pourront tout fait tre utilises par dautres fonctions de votremodule.

    Maintenant, dans le fichier principal de votre application (ex : app.js), vous pouvezfaire appel ces fonctions issues du module !

    1 var monmodule = require('./ monmodule ');23 monmodule.direBonjour ();4 monmodule.direByeBye ();

    require() renvoie en fait un objet qui contient les fonctions que vous avez exportesdans 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 trssimple. Cela vous permet de dcouper votre projet en plusieurs petits fichiers pourrpartir les rles.

    Utiliser NPM pour installer des modules

    Je vous ai parl en introduction de NPM, le Node Package Manager (voir le code websuivant) :

    B

    NPMCode web : 953624

    Je vous ai dit que ctait un moyen (formidable) dinstaller de nouveaux modulesdvelopps par la communaut.

    46

  • UTILISER NPM POUR INSTALLER DES MODULES

    Figure 5.2 Exportation dune fonction

    Imaginez que NPM est un peu lquivalent dapt-get sous Linux pour installer desprogrammes. Une simple commande et le module est tlcharg et install ! En plus,NPM gre les dpendances. Cela signifie que, si un module a besoin dun autre modulepour fonctionner, NPM ira le tlcharger automatiquement !

    NPM est trs actif, il y a plusieurs dizaines de milliers de modules disponibles, et oncompte plusieurs millions de tlchargements par semaine ! Vous y trouverez sans doutevotre bonheur.

    Comme le dit le site web de NPM, il est aussi simple dinstaller de nouveaux modulesque de publier ses propres modules. Cest en bonne partie ce qui explique le grandsuccs de Node.js.

    Comment trouver un module l-dedans ? Autant chercher une aiguille dansune botte de foin !

    Cest assez facile en fait. Je vais vous montrer plusieurs moyens de trouver des modules !

    Trouver un module

    Si vous savez ce que vous cherchez, le site web de NPM vous permet de faire une re-cherche. Mais NPM, cest avant tout une commande ! Vous pouvez faire une recherchedans la console, comme ceci :

    npm search postgresql

    Ce qui aura pour effet de rechercher tous les modules en rapport avec la base de donnesPostgreSQL.

    Si comme moi vous voulez flner un peu et que vous ne savez pas trop ce que vousrecherchez, vous aimerez srement le site Nodetoolbox (voir le code web suivant) :

    47

  • CHAPITRE 5. LES MODULES NODE.JS ET NPM

    B

    Le site nodetoolboxCode web : 537828

    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 votreprojet et tapez :

    npm install nomdumodule

    Le module sera install localement spcialement pour votre projet. Si vous avez unautre projet, il faudra donc relancer la commande pour linstaller nouveau pour cetautre projet. Cela vous permet dutiliser des versions diffrentes dun mme module enfonction de vos projets.

    Allez faisons un test. On va installer le module markdown qui permet de convertir ducode markdown en HTML.

    npm install markdown

    NPM va tlcharger automatiquement la dernire version du module et il va la placerdans un sous-dossier node_modules. Vrifiez donc bien que vous tes dans le dossierde votre projet Node.js avant de lancer cette commande !

    48

  • UTILISER NPM POUR INSTALLER DES MODULES

    Une fois que cest fait, vous avez accs aux fonctions offertes par le module mark-down . Lisez la documentation du module pour savoir comment lutiliser (voir codeweb suivant) :

    B

    Doc du moduleCode web : 353493

    On nous apprend quil faut faire appel lobjet markdown lintrieur du module etquon peut appeler la fonction toHTML pour traduire du Markdown en HTML.

    Essayons a :1 var markdown = require('markdown ').markdown;23 console.log(markdown.toHTML('Un paragraphe en ** markdown ** !'))

    ;

    Cela affichera dans la console :

    Un paragraphe en markdown !

    Ne soyez pas surpris par le require(markdown).markdown. La doc dumodule nous dit que les fonctions sont dans lobjet markdown, donc on vachercher directement cet objet au sein du module.

    Linstallation locale et linstallation globale

    NPM installe les modules localement pour chaque projet. Cest pour cela quil creun sous-dossier node_modules lintrieur de votre projet. Si vous utilisez le mmemodule dans trois projets diffrents, il sera tlcharg et copi trois fois. Cest normal,cela nous permet de grer les diffrences de versions. Cest donc une bonne chose.

    Par contre, il faut savoir que NPM permet aussi dinstaller des modules globaux.Cela ne nous sert que dans de rares cas o le module fournit des excutables (et pasjuste des fichiers .js).

    Cest le cas de notre module markdown par exemple. Pour linstaller globalement,on va ajouter le paramtre -g la commande npm :

    npm install markdown -g

    Vous aurez alors accs un excutable md2html dans votre console :

    echo Hello *World*! | md2html

    Les modules installs globalement ne peuvent pas tre inclus dans vos projetsNode.js avec require() ! Ils servent juste fournir des commandes sup-plmentaires dans la console. Si vous voulez les utiliser en JavaScript, vousdevez donc aussi les installer normalement (sans le -g) en local.

    49

  • CHAPITRE 5. LES MODULES NODE.JS ET NPM

    Mettre jour les modules

    Avec une simple commande :

    npm update

    NPM va chercher sur les serveurs sil y a de nouvelles versions des modules, puismettre jour les modules installs sur votre machine (en veillant ne pas casser lacompatibilit) et il supprimera les anciennes versions. Bref, cest la commande magique.

    Dclarer et publier son module

    Si votre programme a besoin de modules externes, vous pouvez les installer un uncomme vous venez dapprendre le faire, mais vous allez voir que a va vite devenirassez compliqu maintenir. Cest dautant plus vrai si vous utilisez de nombreuxmodules. Comme ces modules voluent de version en version, votre programme pourraitdevenir incompatible suite une mise jour dun module externe !

    Heureusement, on peut rgler tout a en dfinissant les dpendances de notre pro-gramme dans un simple fichier JSON. Cest un peu la carte didentit de notreapplication.

    Crez un fichier package.json dans le mme dossier que votre application. Commen-ons simplement avec ce code :1 {2 "name": "mon -app",3 "version": "0.1.0",4 "dependencies": {5 "markdown": "~0.4"6 }7 }

    Ce fichier JSON contient 3 paires cl-valeur :

    name : cest le nom de votre application. Restez simple, vitez espaces et accents. version : cest le numro de version de votre application. Il est compos dun

    numro de version majeure, de version mineure et de patch. Jy reviens justeaprs.

    dependencies : cest un tableau listant les noms des modules dont a besoinvotre application pour fonctionner ainsi que les versions compatibles.

    Le fichier peut tre beaucoup plus complet, je ne vous ai montr ici que lesvaleurs essentielles. Pour tout connatre sur le fonctionnement de ce fichierpackage.json, je vous recommande de consulter la page indique dans lecode web suivant.)

    50

  • DCLARER ET PUBLIER SON MODULE

    B

    Cheat sheetCode web : 967025

    Le fonctionnement des numros de version

    Pour bien grer les dpendances et savoir mettre jour le numro de versionde son application, il faut savoir comment fonctionnent les numros de version avecNode.js. Il y a pour chaque application :

    Un numro de version majeure. En gnral on commence 0 tant que lap-plication nest pas considre comme mature. Ce numro change trs rarement,uniquement quand lapplication a subi des changements trs profonds.

    Un numro de version mineure. Ce numro est chang chaque fois quelapplication est un peu modifie.

    Un numro de patch. Ce numro est chang chaque petite correction debug ou de faille. Les fonctionnalits de lapplication restent les mmes entre lespatchs, il sagit surtout doptimisations et de corrections indispensables.

    La figure 5.4 rcapitule tout ceci :

    Figure 5.4 Les numros de version dune application Node.js

    Ici, jai donc choisi de commencer numroter mon application la version 0.1.0 (onaurait aussi pu commencer 1.0.0 mais cela aurait t prtentieux).

    Si je corrige un bug, lapplication passera la version 0.1.1 et il me faudra mettre jour ce numro dans le fichier package.json.

    Si jamliore significativement mon application, elle passera la version 0.2.0,puis 0.3.0 et ainsi de suite.

    Le jour o je considre quelle a atteint un jalon important, et quelle est mature,je pourrai la passer en version 1.0.0.

    51

  • CHAPITRE 5. LES MODULES NODE.JS ET NPM

    La gestion des versions des dpendances

    Cest vous dindiquer avec quelles versions de ses dpendances votre applicationfonctionne. Si votre application dpend du module markdown v0.3.5 trs prcisment,vous crirez :1 "dependencies": {2 "markdown": "0.3.5" // Version 0.3.5 uniquement3 }

    Si vous faites un npm update pour mettre jour les modules externes, markdown nesera jamais mis jour (mme si lapplication passe en version 0.3.6). Vous pouvezmettre un tilde (~) devant le numro de version pour autoriser les mises jour jusqula prochaine version mineure :1 "dependencies": {2 "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 incluse3 }

    Si vous voulez, vous pouvez ne pas indiquer de numro de patch. Dans ce cas, lesmodules seront mis jour mme si lapplication change de version mineure :1 "dependencies": {2 "markdown": "~0.3" // OK pour les versions 0.3.X, 0.4.X, 0.

    5.X jusqu ' la version 1.0.0 non incluse3 }

    Attention nanmoins : entre deux versions mineures, un module peut changer suffi-samment et votre application pourrait tre incompatible. Je recommande daccepteruniquement 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 pouvezaussi crer des modules qui offrent des fonctionnalits. Si vous pensez que votre modulepourrait servir dautres personnes, nhsitez pas le partager ! Vous pouvez trsfacilement le publier sur NPM pour que dautres personnes puissent linstaller leurtour.

    Je rappelle quun module nest rien dautre quune application Node.js quicontient 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. Vrifiezque vous avez :

    52

  • DCLARER ET PUBLIER SON MODULE

    Un fichier package.json qui dcrit votre module (au moins son nom, sa versionet ses dpendances).

    Un fichier README.md (crit en markdown) qui prsente votre module defaon un peu dtaille. Nhsitez pas y inclure un mini-tutoriel expliquantcomment utiliser votre module !

    Il ne vous reste plus qu faire :

    npm publish

    Et voil, cest fait !

    Il ne vous reste plus qu parler de votre module autour de vous, le prsenter sur lesmailing-lists de Node.js. . . Les portes de la gloire des geeks barbus vous attendent !(Voir figure 5.5)

    Figure 5.5 Votre module est publi, vous la gloire !

    En rsum

    Vous pouvez crer des modules Node.js pour mieux dcoupler votre code etviter de tout crire dans un seul et mme fichier.

    Vous appellerez vos modules avec require() comme vous le faites pour lesmodules officiels de Node.js.

    Toutes les fonctions dans le fichier de module qui peuvent tre appeles depuislextrieur 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 modulescods par la communaut en un clin dil.

    Les modules tlchargs avec NPM sont par dfaut installs localement dans unsous-dossier node_modules de votre application.

    Lextension -g permet dinstaller un module globalement pour tout votre ordi-nateur. Elle nest utile que pour certains modules prcis.

    Vous pouvez diffuser vos propres modules au reste de la communaut en crant

    53

  • CHAPITRE 5. LES MODULES NODE.JS ET NPM

    un fichier package.json, un README.md et avec un simple appel npm pu-blish .

    54

  • Chapitre6Le 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. Cestpour cela quon a invent les bibliothques puis les frameworks, qui sont des sortes desuper-bibliothques.

    55

  • CHAPITRE 6. LE FRAMEWORK EXPRESS.JS

    Si vous flnez un peu sur NPM, vous allez vite voir quil existe un module plbiscit :Express.js . Il sagit en fait dun micro-framework pour Node.js. Il vous fournitdes outils de base pour aller plus vite dans la cration dapplications Node.js.

    Mais attention : nallez pas comparer Express.js avec des poids lourds tels Djangoou Symfony2 ! Ceux-ci vous offrent des fonctionnalits trs compltes et puissantes(comme la gnration dinterfaces dadministration), ce qui nest pas vraiment le casdExpress. Pourquoi ? Parce que nous partons de loin avec Node.js. Express vouspermet donc dtre un peu moins bas niveau et de grer par exemple plus facilementles routes (URLs) de votre application et dutiliser des templates. Rien que a seradj une petite rvolution pour nous !

    Pour suivre ce chapitre, crez-vous un dossier pour faire une application de testNode.js.Installez-y Express avec la commande npm install express.

    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 if (page == '/') {2 // ...3 }4 else if (page == '/sous -sol') {5 // ...6 }7 else if (page == '/etage/1/chambre ') {8 // ...9 }

    Lorsque lon cre des applications web, on manipule des routes comme ici. Ce sont lesdiffrentes URLs auxquelles notre application doit rpondre.

    La gestion des routes est un sujet important qui doit tre trait avec srieux. Sivous avez dj manipul des frameworks comme Django ou Symfony2, vous voyezcertainement ce que je veux dire. Sinon, retenez juste ceci : bien grer les URLs deson site est important, surtout lorsque celui-ci grossit. Et Express nous aide fairecela correctement.

    Routes simples

    Voici une application trs basique utilisant Express pour commencer :

    1 var express = require('express ');23 var app = express ();45 app.get('/', function(req , res) {6 res.setHeader('Content -Type', 'text/plain ');

    56

  • LES ROUTES

    7 res.end('Vous tes l\'accueil ');8 });910 app.listen(8080);

    Noubliez pas de faire npm install express pour que ce code fonctionne !

    Vous commencez par demander linclusion dExpress et vous crez un objet app enappelant la fonction express().

    Ensuite, il vous suffit dindiquer les diffrentes routes (les diffrentesURLs) laquellevotre application doit rpondre. Ici, jai cr une seule route, la racine / . Unefonction de callback est appele lorsque quelquun demande cette route.

    Ce systme est beaucoup mieux conu que nos if imbriqus. On peut crire autant deroutes quon le souhaite de cette faon :

    1 app.get('/', function(req , res) {2 res.setHeader('Content -Type', 'text/plain ');3 res.end('Vous tes l\'accueil , que puis -je pour vous ?');4 });56 app.get('/sous -sol', function(req , res) {7 res.setHeader('Content -Type', 'text/plain ');8 res.end('Vous tes dans la cave vins , ces bouteilles sont

    moi !');9 });1011 app.get('/etage/1/chambre ', function(req , res) {12 res.setHeader('Content -Type', 'text/plain ');13 res.end('H ho , c\'est priv ici !');14 });

    Si vous voulez grer les erreurs 404, vous devez inclure les lignes suivantes la fin devotre code obligatoirement (juste avant app.listen) :

    1 // ... Tout le code de gestion des routes (app.get) se trouveau -dessus

    23 app.use(function(req , res , next){4 res.setHeader('Content -Type', 'text/plain ');5 res.send(404 , 'Page introuvable !');6 });78 app.listen(8080);

    Ne vous proccupez pas trop pour linstant de la syntaxe et des paramtres, nous yreviendrons un peu plus tard. Nous apprenons juste grer les routes avec Expresspour le moment.

    57

  • CHAPITRE 6. LE FRAMEWORK EXPRESS.JS

    Express vous permet de chaner les appel get() et use() :

    1 app.get('/', function(req , res) {23 })4 .get('/sous -sol', function(req , res) {56 })7 .get('/etage/1/chambre ', function(req , res) {89 })10 .use(function(req , res , next){1112 });

    Cela revient faire app.get().get().get(). . . Cela fonctionne parce que ces fonctionsse 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 cetteforme.

    Routes dynamiques

    Express vous permet de grer des routes dynamiques, cest--dire des routes dontcertaines portions peuvent varier. Vous devez crire :nomvariable dans lURL de laroute, ce qui aura pour effet de crer un paramtre accessible depuis req.params.nomvariable.Dmonstration :

    1 app.get('/etage/: etagenum/chambre ', function(req , res) {2 res.setHeader('Content -Type', 'text/plain ');3 res.end('Vous tes la chambre de l\'tage n' + req.

    params.etagenum);4 });

    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 sontvalides :

    /etage/1/chambre /etage/2/chambre /etage/3/chambre /etage/nawak/chambre

    Comment a, on peut mettre nimporte quoi ? Comment fait-on pour imposerla prsence dun nombre ?

    Le visiteur peut en effet crire nimporte quoi dans lURL. Cest donc vous de vrifierdans votre fonction de callback que le paramtre est bien un nombre et de renvoyerune 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 nousavait donn du code lourd et dlicat maintenir qui ressemblait ceci :

    1 res.write(''+2 ''+3 ' '+4 ' '+5 ' Ma page Node.js !'+6 ' '+7 ' '+8 ' Voici un paragraphe HTML !'+9 ' '+10 '');

    Horrible, nest-ce pas ? Heureusement, Express nous permet dutiliser des templatespour 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 contenuvariable.

    PHP lui-mme est en ralit un langage de template qui nous permet de faire ceci :

    1 Vous tes le visiteur n

    Il existe beaucoup dautres langages de templates, comme Twig, Smarty, Haml,JSP, Jade, EJS, etc. Express vous permet dutiliser la plupart dentre eux, chacunayant son lot davantages et dinconvnients. En gnral, ils grent tous lessentiel, savoir les variables, les conditions, les boucles, etc.

    Le principe est le suivant : depuis votre fichier JavaScript, vous appelez le templatede votre choix en lui transmettant les variables dont il a besoin pour construire la page(voir figure 6.1).

    Figure 6.1 Les templates avec Node.js

    59

  • CHAPITRE 6. LE FRAMEWORK EXPRESS.JS

    Les bases dEJS

    Comme il existe de nombreux systmes de templates, je vais en choisir un dans le lot.Je vous propose ici dutiliser celui propos dans le code web suivant :

    B

    EJS - (Embedded JavaScript)Code web : 177569

    Installez-le pour le projet :

    npm install ejs

    Nous pouvons maintenant dlguer la gestion de la vue (du HTML) notre moteurde template. Plus besoin dcrire du HTML au milieu du code JavaScript commeun cochon !

    1 app.get('/etage/: etagenum/chambre ', function(req , res) {2 res.render('chambre.ejs', {etage: req.params.etagenum });3 });

    Ce code fait appel un fichier chambre.ejs qui doit se trouver dans un sous-dossier appel views . Crez donc un fichier /views/chambre.ejs et placez-y lecode suivant :

    1 Vous tes dans la chambre 23 Vous tes l'tage n

    La balise sera remplace par la variable etage que lon a transmise autemplate avec {etage: req.params.etagenum} !

    Plusieurs paramtres et des boucles

    Sachez que vous pouvez envoyer plusieurs paramtres vos templates, y comprisdes tableaux ! Pour cette dmonstration, nous allons faire une application qui comptejusqu un nombre envoy en paramtre et qui affiche un nom au hasard au sein duntableau (je suis en manque dinspiration, je le sais bien !).

    Voici le code JavaScript :

    1 app.get('/compter /: nombre ', function(req , res) {2 var noms = ['Robert ', 'Jacques ', 'David'];3 res.render('page.ejs', {compteur: req.params.nombre , noms:

    noms});4 });

    On transmet le nombre envoy en paramtre et une liste de noms sous forme de tableau.Ensuite, dans le template EJS :

    1 Je vais compter jusqu ' 2

    60

  • ALLER PLUS LOIN : CONNECT ET LES MIDDLEWARES

    3

  • CHAPITRE 6. LE FRAMEWORK EXPRESS.JS

    Express, connect et les middlewares

    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 ajoutcertaines 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 communi-quer 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 dveloppeurspeuvent bien entendu en proposer dautres via NPM. Les middlewares livrs avecConnect fournissent chacun des micro-fonctionnalits. Il y a par exemple :

    Compress : permet la compression gzip de la page pour un envoi plus rapideau 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 sectiondu site.

    Csrf : fournit une protection contre les failles CSRF. Etc.

    Tous ces middlewares offrent vraiment des micro-fonctionnalits. Il y en a des touspetits comme favicon par exemple, qui se contente de grer la favicon de votresite (licne qui reprsente votre site).

    Grce Connect, ces middlewares sont interconnects et peuvent communiquerentre eux. Express ne fait quajouter les routes et les vues par-dessus lensemble (voirschma la figure 6.3).

    Le principe de Connect est que tous ces middlewares communiquent entre eux ense renvoyant jusqu quatre paramtres :

    err : les erreurs. req : la requte du visiteur. res : la rponse renvoyer (la page HTML et les informations den-tte). next : un callback vers la prochaine fonction appeler.

    Si je devais rsumer les potentialits de Connect dans un schma, cela donnerait lafigure 6.4.

    62

  • ALLER PLUS LOIN : CONNECT ET LES MIDDLEWARES

    Figure 6.3 Les fonctionnalits offertes par Express viennent en grande partie deConnect

    Figure 6.4 Les middlewares communiquent les paramtres grce Connect

    63

  • CHAPITRE 6. LE FRAMEWORK EXPRESS.JS

    Nhsitez pas lire la doc. de Connect6 puis lire celle dExpress que voustrouverez dans le code web suivant. Vous y trouverez toutes les informationsdont vous avez besoin pour utiliser les middlewares.

    B

    La doc. dExpressCode web : 822156

    Utiliser les fonctionnalits de Connect au sein dExpress

    Si je vous raconte tout cela, cest parce que vous en avez besoin pour tirer pleinementpartie dExpress. En effet, vous pouvez appeler les diffrents modules de Connectavec la mthode app.use(). Par exemple, vous pouvez faire :

    1 app.use(express.logger ()) // Active le middleware de logging2 .use(express.static(__dirname + '/public ')) // Indique que le

    dossier /public contient des fichiers statiques3 .use(express.favicon(__dirname + '/public/favicon.ico')) //

    Active la favicon indique4 .use(function(req , res){ // Rpond enfin5 res.send('Hello');6 });

    Lordre dappel des middlewares est extrmement important. Par exemple,on commence par activer