16
Node.js Julien FONTANET Olivier LAMBERT Exploitez la puissance de JavaScript côté serveur

Node.js - Exploitez la puissance de JavaScript côté ...multimedia.fnac.com/multimedia/editorial/pdf/9782746089785.pdf · 39 € ISBN : 978-2-7460-8978-5 Node.js - Exploitez la puissance

  • Upload
    others

  • View
    18

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Node.js - Exploitez la puissance de JavaScript côté ...multimedia.fnac.com/multimedia/editorial/pdf/9782746089785.pdf · 39 € ISBN : 978-2-7460-8978-5 Node.js - Exploitez la puissance

ISBN

: 978

-2-7

460-

8978

-5

39 €

Node.js - Exploitez la puissance de JavaScript côté serveurJulien FONTANET a démarré sa carrière d’informaticien comme Consultant indépendant autour du développement Open source. Olivier LAMBERT a été Adminis-trateur système et réseau dans une multinationale.

En 2012, Julien et Olivier déci-dent de mutualiser leur expé-rience et leurs compétences et créent leur entreprise, Vates SAS. Ils sont à l’origine de la solution Xen Orchestra et leur quotidien est aujourd’hui fait de dévelop-pement JavaScript avec Node.js. Ils dispensent régulièrement des formations sur cette plateforme ainsi que sur AngularJS et Git. À travers les pages de ce livre ils partagent avec enthousiasme leur connaissance de Node et fournissent aux lecteurs un ou-vrage complètement opération-nel sur le sujet.

Ce livre s’adresse aux développeurs souhaitant découvrir et maîtriser la plateforme JavaScript Node.js. De bonnes connaissances sur le développement en JavaScript ainsi que sur les outils en ligne de commande sont nécessaires afin de tirer le meilleur parti de ce livre.

La progression pédagogique choisie par les auteurs débute par l’installation de Node sur les trois grands systèmes d’ex-ploitation (GNU/Linux, OS X et Windows) puis couvre le fonc-tionnement du gestionnaire de paquets « npm », qui est le compagnon quotidien du développeur Node, et la présenta-tion des concepts essentiels de la plateforme.

Les chapitres suivants présentent les puissants paradigmes que sont les flux et les promesses puis enchaînent sur des explications pratiques concernant la manipulation de fichiers et l’utilisation de bases de données. Viennent en-suite l’écriture des tests, les outils de développement qui per-mettent d’améliorer la qualité du code et de simplifier la vie du développeur en automatisant un maximum de tâches (comme par exemple JSHint et Gulp), les bonnes pratiques pour déboguer efficacement du code puis tout ce qu’il faut savoir pour la mise en production des applications.

Tout au long du livre, l’accent est mis sur les bonnes pra-tiques et l’ensemble des exemples présentés dans le livre est disponible sur le dépôt GitHub du livre afin que le lecteur puisse se lancer le plus rapidement possible.

Des éléments complémentaires sont en téléchargement sur le site www.editions-eni.fr.

Pour plus d’informations :

Avant-propos • Présentation • Installation • Gestionnaire de paquets npm • Concepts • Flux • Manipulation de fichiers • Promesses • Application en ligne de commande • Application web • Bases de données • Tests • Outils de développement • Débogage • Mise en production

Les chapitres du livre

Nod

e.js

- Ex

ploi

tez

la p

uiss

ance

de

Java

Scr

ipt c

ôté

serv

eur

Node.js

Julien FONTANET Olivier LAMBERT

Exploitez la puissance

de JavaScriptcôté serveurTéléchargement

www.editions-eni.fr.fr

Sur www.editions-eni.fr :b Le code des exemples du livre.

Page 2: Node.js - Exploitez la puissance de JavaScript côté ...multimedia.fnac.com/multimedia/editorial/pdf/9782746089785.pdf · 39 € ISBN : 978-2-7460-8978-5 Node.js - Exploitez la puissance

1Table des matières

Avant-propos

1. Pourquoi ce livre ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

2. À qui s'adresse cet ouvrage ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3. Structure de l'ouvrage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

Chapitre 1

Présentation

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2. Définition de Node . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

3. Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

4. Success-stories. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

5. Programmation orientée composant . . . . . . . . . . . . . . . . . . . . . . . . . . 21

Chapitre 2

Installation

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2. GNU/Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.1 n : simple et efficace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.2 Via les paquets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

2.2.1 Ubuntu/Debian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.2.2 Gentoo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.2.3 ArchLinux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.2.4 RHEL, CentOS, Fedora, etc. . . . . . . . . . . . . . . . . . . . . . . . 26

Les éléments à télécharger sont disponibles à l'adresse suivante :http://www.editions-eni.fr

Saisissez la référence de l'ouvrage EINOD dans la zone de recherche et validez. Cliquez sur le titre du livre puis sur le bouton de téléchargement.

Page 3: Node.js - Exploitez la puissance de JavaScript côté ...multimedia.fnac.com/multimedia/editorial/pdf/9782746089785.pdf · 39 € ISBN : 978-2-7460-8978-5 Node.js - Exploitez la puissance

2Exploitez la puissance de JavaScript côté serveur

Node.js

2.3 Via les sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

3. OpenBSD et FreeBSD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

4. Mac OS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

5. Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

6. Vérification de l’installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

Chapitre 3

Gestionnaire de paquets npm

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311.1 Qu'est-ce qu'un paquet ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311.2 Exemple d'installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321.3 Registre npmjs.org . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321.4 Paquet global. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

2. Recherche du bon paquet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342.1 Recherche en ligne de commande . . . . . . . . . . . . . . . . . . . . . . . . 342.2 Recherche sur npmjs.org . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352.3 Critères de confiance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

2.3.1 Popularité sur GitHub . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362.3.2 Intégration continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

3. Versionnage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373.1 Numéro de version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373.2 Contrainte de version. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

4. Gestion des dépendances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394.1 Ajout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

4.1.1 Dépendance de production . . . . . . . . . . . . . . . . . . . . . . . . 404.1.2 Dépendance optionnelle. . . . . . . . . . . . . . . . . . . . . . . . . . . 404.1.3 Développement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

4.2 Mise à jour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414.3 Suppression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424.4 Listage des dépendances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

Page 4: Node.js - Exploitez la puissance de JavaScript côté ...multimedia.fnac.com/multimedia/editorial/pdf/9782746089785.pdf · 39 € ISBN : 978-2-7460-8978-5 Node.js - Exploitez la puissance

3Table des matières

4.5 Installation des dépendances manquantes . . . . . . . . . . . . . . . . . 43

5. Publication d’un paquet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435.1 Création d'un compte sur le registre . . . . . . . . . . . . . . . . . . . . . . 445.2 Saisie des métadonnées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455.3 Exécutables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455.4 Publication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

6. Gestion d’un paquet publié . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476.1 Mise à jour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476.2 Ajout des mainteneurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

Chapitre 4

Concepts

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

2. Modules. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492.1 Modules de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

2.1.1 Stabilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522.1.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

3. Variables globales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533.1 global . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533.2 process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

3.2.1 Événements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543.2.2 Signaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543.2.3 Flux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553.2.4 Contexte d'exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563.2.5 Métriques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

3.3 console. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583.4 Buffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

3.4.1 Construction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603.4.2 Conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613.4.3 Manipulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

3.5 require() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

Page 5: Node.js - Exploitez la puissance de JavaScript côté ...multimedia.fnac.com/multimedia/editorial/pdf/9782746089785.pdf · 39 € ISBN : 978-2-7460-8978-5 Node.js - Exploitez la puissance

4Exploitez la puissance de JavaScript côté serveur

Node.js

3.6 __filename et __dirname . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633.7 module. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633.8 exports. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633.9 Minuteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

4. Programmation asynchrone. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644.1 API asynchrone dans Node . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654.2 Programmation événementielle . . . . . . . . . . . . . . . . . . . . . . . . . . 694.3 Boucle d’événements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

4.3.1 Fonctionnement simplifié . . . . . . . . . . . . . . . . . . . . . . . . . 714.3.2 Fonctionnement détaillé . . . . . . . . . . . . . . . . . . . . . . . . . . 72

Chapitre 5

Flux

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751.1 Qu'est-ce qu'un flux ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

1.1.1 Mode de flux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761.2 Pourquoi utiliser un flux ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

2. Construction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 782.1 Readable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 782.2 Writable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 802.3 Duplex. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 812.4 Transform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

3. Utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833.1 Lecture. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

3.1.1 Mode flot. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833.1.2 Mode à la demande. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843.1.3 Sélection du mode de lecture . . . . . . . . . . . . . . . . . . . . . . . 85

3.2 Écriture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853.3 Connexion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

Page 6: Node.js - Exploitez la puissance de JavaScript côté ...multimedia.fnac.com/multimedia/editorial/pdf/9782746089785.pdf · 39 € ISBN : 978-2-7460-8978-5 Node.js - Exploitez la puissance

5Table des matières

4. Omniprésence dans Node . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 864.1 Réseau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 864.2 Fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

5. Implémentations et compatibilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . 875.1 Support des flux version 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885.2 S'affranchir de la version de Node . . . . . . . . . . . . . . . . . . . . . . . 88

Chapitre 6

Manipulation de fichiers

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

2. Manipulation de chemin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

3. Manipulation de dossiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

4. Manipulation de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 944.1 Métadonnées. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 944.2 Surveillance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

5. Manipulation de liens symboliques. . . . . . . . . . . . . . . . . . . . . . . . . . 101

Chapitre 7

Promesses

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

2. Callbacks vs promesses. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

3. Notion de promesse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1063.1 États d'une promesse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1083.2 Similarité avec du code synchrone . . . . . . . . . . . . . . . . . . . . . . 1083.3 Gestion des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

4. Création d'une promesse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1114.1 À la main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1114.2 À partir d'une fonction Node. . . . . . . . . . . . . . . . . . . . . . . . . . . 1124.3 À partir d'un événement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

Page 7: Node.js - Exploitez la puissance de JavaScript côté ...multimedia.fnac.com/multimedia/editorial/pdf/9782746089785.pdf · 39 € ISBN : 978-2-7460-8978-5 Node.js - Exploitez la puissance

6Exploitez la puissance de JavaScript côté serveur

Node.js

5. Intégration avec Node . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

6. Intégration avec les générateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

Chapitre 8

Application en ligne de commande

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

2. Gestion des paramètres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

3. Testabilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

4. Exécution directe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

5. Installation du programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

6. Exemple complet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

Chapitre 9

Application web

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129

2. Générateur Express. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

3. Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

4. Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

5. Requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

6. Réponse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

7. Distribution de fichiers statiques . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

8. Routage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

Page 8: Node.js - Exploitez la puissance de JavaScript côté ...multimedia.fnac.com/multimedia/editorial/pdf/9782746089785.pdf · 39 € ISBN : 978-2-7460-8978-5 Node.js - Exploitez la puissance

7Table des matières

Chapitre 10

Bases de données

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

2. SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1402.1 PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

3. NoSQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1413.1 MongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

3.1.1 Mongoose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1423.2 Redis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1433.3 LevelDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

Chapitre 11

Tests

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

2. Lanceur de tests - Mocha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1512.1 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1512.2 Création d'une suite de tests . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

3. Assertions - Chai. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156

4. Espions et bouchons - Sinon.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1604.1 Espions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1604.2 Bouchons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

Chapitre 12

Outils de développement

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

2. Automatisation de tâches - Gulpjs . . . . . . . . . . . . . . . . . . . . . . . . . . 1662.1 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1662.2 Création de tâches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

Page 9: Node.js - Exploitez la puissance de JavaScript côté ...multimedia.fnac.com/multimedia/editorial/pdf/9782746089785.pdf · 39 € ISBN : 978-2-7460-8978-5 Node.js - Exploitez la puissance

8Exploitez la puissance de JavaScript côté serveur

Node.js

3. Analyse du code - JSHint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1713.1 Installation et utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1723.2 Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1733.3 Environnements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1743.4 Options générales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1753.5 Options de mise en conformité . . . . . . . . . . . . . . . . . . . . . . . . . 1783.6 Options assouplissantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186

4. Redémarrage automatique - node-dev . . . . . . . . . . . . . . . . . . . . . . . 197

5. Browserify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198

Chapitre 13

Débogage

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201

2. Ajout de traces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201

3. Node-Inspector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2033.1 Installation et lancement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2033.2 Contrôle de l'exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2053.3 Inspection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2093.4 Intervention . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211

Chapitre 14

Mise en production

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215

2. Forever. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215

3. Supervision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217

4. Recettes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2184.1 Reverse proxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218

4.1.1 Avec Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2194.1.2 Avec Nginx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220

Page 10: Node.js - Exploitez la puissance de JavaScript côté ...multimedia.fnac.com/multimedia/editorial/pdf/9782746089785.pdf · 39 € ISBN : 978-2-7460-8978-5 Node.js - Exploitez la puissance

9Table des matières

4.2 Intégration avec systemd (GNU/Linux) . . . . . . . . . . . . . . . . . . 2204.2.1 Fichier de configuration . . . . . . . . . . . . . . . . . . . . . . . . . . 2214.2.2 Activation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2224.2.3 Utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222

4.3 Intégration avec SaltStack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2224.3.1 Installation et déploiement . . . . . . . . . . . . . . . . . . . . . . . 2234.3.2 npm via SaltStack. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225

Page 11: Node.js - Exploitez la puissance de JavaScript côté ...multimedia.fnac.com/multimedia/editorial/pdf/9782746089785.pdf · 39 € ISBN : 978-2-7460-8978-5 Node.js - Exploitez la puissance

103

Chapitre 7

Promesses

Promesses1. Introduction

Ce chapitre est dédié aux promesses. Mais avant d'explorer ce concept, il estpertinent de comprendre pourquoi l'utiliser.

S’ensuivra une analyse détaillée d’une promesse : ses états, l’approche sem-blabe à du code synchrone et la gestion des erreurs. Puis, nous verrons com-ment créer une promesse de différentes façons, ce qui permettera de bienappréhender le concept. Enfin, nous explorerons l’intégration des promessesdans Node et dans les générateurs.

2. Callbacks vs promesses

L'approche traditionnelle avec Node est d'utiliser des callbacks. Ainsi, on nebloque pas le serveur en attendant d'exécuter une tâche : celle-ci est lancée, etune fois terminée, elle appelle une fonction.

Cependant, les callbacks souffrent de plusieurs maux. Et le premier est le pro-blème de l'imbrication : effectivement, en cas d'appels successifs à de nom-breuses callbacks, le code devient rapidement illisible, et pire, dur à maintenir.

Page 12: Node.js - Exploitez la puissance de JavaScript côté ...multimedia.fnac.com/multimedia/editorial/pdf/9782746089785.pdf · 39 € ISBN : 978-2-7460-8978-5 Node.js - Exploitez la puissance

© E

dit

ions

EN

I -

All r

ights

rese

rved

104Exploitez la puissance de JavaScript côté serveur

Node.js

De surcroît, il faut gérer les erreurs à la main : d'ailleurs, si l'on oublie d'en trai-ter une, on fait face à de gros problèmes (une erreur non traitée est difficile àidentifier pendant l'exécution du programme). Ce n'est pas tout : les excep-tions donnent aussi quelques sueurs froides. Par exemple, il suffit d'en lancerune au sein d'une callback pour obtenir un système instable car personne nepeut la rattraper (try {} catch {}). En outre, Node ne supporte pas lesexceptions non gérées. Sans oublier le fait qu'il est impossible de récupérer lapile d'erreurs complète ! Vraiment gênant pour le débogage.

Autre subtilité, il est nécessaire de faire très attention à la manière dont onappelle une callback. Synchrone ou asynchrone, il faut choisir, car si l'onmélange les paradigmes, il est de coutume de dire qu'on libère « Zalgo »(monstre de l'imaginaire populaire, sorte d'abomination qui rend fou). Et cegenre de comportement rend effectivement fou : impossible de prédire le com-portement de la callback ! Et au final, de quoi s’arracher les cheveux pour trou-ver l'origine du problème.

Enfin, pour clore cette longue liste de difficultés, une callback doit par défini-tion être appelée une fois au maximum. Si ce point peut paraître étrange,sachez qu’un appel multiple par erreur peut arriver dans une fonction un peulongue ou complexe, avec par exemple un abus de copier/coller. Toujours est-il que rien ne protège de cette erreur.

Mais heureusement, les promesses sont là pour remédier à ces problèmes. Etc'est exactement pour cela qu'elles bénéficient d'un chapitre complet.

Un exemple est bien entendu beaucoup plus parlant. Voici le code de la sec-tion Programmation asynchrone du chapitre Concepts, réécrit en utilisant lespromesses et l'API de Bluebird (utilisée tout au long du chapitre).

var Bluebird = require('bluebird');

var got = Bluebird.promisify(require('got'));var writeFile = Bluebird.promisify(require('fs').writeFile);

var files = [ { name: 'foo.html', url: 'http://example.org/foo.html', }, {

Page 13: Node.js - Exploitez la puissance de JavaScript côté ...multimedia.fnac.com/multimedia/editorial/pdf/9782746089785.pdf · 39 € ISBN : 978-2-7460-8978-5 Node.js - Exploitez la puissance

105PromessesChapitre 7

name: 'bar.html', url: 'http://example.org/bar.html', },];

Bluebird

// Télécharge en parallèle tous les fichiers de `files`. .map(files, function (file) { return got(file.url); })

// Puis les enregistre sur le disque (toujours en parallèle). .map(function (result, i) { // got() retourne deux résultats que Bluebird.promisify() // transforme en tableau. var content = result[0];

return writeFile(files[i].name, content); })

.then(function () { console.log('Tout s\'est bien passé'); }) .catch(function (error) { console.error(error); });

En premier, il ne faut pas oublier d'inclure la bibliothèque bluebird viarequire() (il sera expliqué ce qu'est Bluebird plus loin). La différence entrele code du chapitre Concepts et celui-ci commence juste après : les deux fonc-tions requises (got et writeFile) sont « promessifiées » (voir la sectionCréation d'une promesse - À partir d'une fonction Node) avec la fonctionpromesify() que vous allez observer tout au long de ce chapitre.

Les deux fichiers sont toujours foo.html et bar.html, dans la variable files.

Page 14: Node.js - Exploitez la puissance de JavaScript côté ...multimedia.fnac.com/multimedia/editorial/pdf/9782746089785.pdf · 39 € ISBN : 978-2-7460-8978-5 Node.js - Exploitez la puissance

© E

dit

ions

EN

I -

All r

ights

rese

rved

106Exploitez la puissance de JavaScript côté serveur

Node.js

Ensuite, le premier appel à Bluebird.map() applique la fonction got àtous les éléments du tableau, autrement dit : on télécharge en parallèle tousles fichiers présents dans files. L'enregistrement sur le disque se passe aussivia un appel à map() qui met les résultats de la lecture des fichiers dans untableau. Ces résultats sont écrits via writeFile(), et tout à la fin, à la der-nière étape, au niveau de then(), est affiché un message indiquant si touts'est bien déroulé (ou pas).

La gestion des erreurs se situe à un seul endroit, au niveau de catch() !Comme on peut le constater, l'écriture d'un tel code est fortement simplifiéecomparativement à la version callbacks. Et ce n'est que le début : il est tempsde comprendre maintenant le concept de promesse.

3. Notion de promesse

La promesse est un paradigme de programmation asynchrone qui résout avecstyle beaucoup de problèmes que l'on trouve en utilisant le passage de conti-nuations (la convention dans Node).

Et concrètement ? Une promesse est un objet représentant une valeur qui seradisponible dans le futur.

Par exemple, avec readFile() qui est asynchrone, le contenu du fichierfoo.txt ne sera disponible que plus tard :

var promise = readFile('foo.txt');

Il est possible d'accéder à la valeur d'une promesse en enregistrant une fonc-tion callback avec la méthode .then(callback) qui sera appelée quandcette valeur sera disponible. Voici ce que cela donne pour afficher le résultatde promise :

promise.then(function (content) {console.log('le contenu de foo.txt est', content);});

Page 15: Node.js - Exploitez la puissance de JavaScript côté ...multimedia.fnac.com/multimedia/editorial/pdf/9782746089785.pdf · 39 € ISBN : 978-2-7460-8978-5 Node.js - Exploitez la puissance

107PromessesChapitre 7

Une promesse peut être rejetée, par exemple si la lecture du fichier a échoué.L'erreur associée à ce rejet peut être récupérée de la même façon qu'est récupé-rée la valeur, mais avec la méthode .catch(callback) :

promise.catch(function (error) { console.error('la lecture a échoué car', error);});

Les promesses sont tellement pratiques qu'elles seront incluses par défautdans la prochaine version de JavaScript (ECMAScript 6) avec l'objet Promiseet qu'elles sont utilisées dans la plupart des nouvelles API de HTML5.

Outre l'implémentation officielle, il existe un grand nombre de bibliothèquesimplémentant les promesses tout en respectant la spécification standard A+,ce qui leur permet d'être complètement intercompatibles.

Remarque

A+ est un standard open source pour les promesses en JavaScript. Il explicitela terminologie commune et le cahier des charges pour quiconque souhaite-rait faire une bibliothèque de promesses. Pour plus de détails sur ce qu'est A+,nous vous invitons à consulter cette URL : https://promisesaplus.com/.

Node ne fournissant pas pour le moment d'implémentation native, il estnécessaire d'utiliser l'une de ces bibliothèques. Historiquement la plus utiliséefut Q (disponible à cette adresse : https://github.com/kriskowal/q), cepen-dant elle est de plus en plus remplacée par Bluebird. Le dépôt officiel et ladocumentation sont accessibles via cette URL : https://github.com/petkaan-tonov/bluebird. Non contente d'être l'une des plus performantes (sinon la plusperformante), elle propose aussi un nombre impressionnant de méthodes trèspratiques permettant de gagner considérablement en efficacité lors du déve-loppement avec des promesses.

Dans les exemples de ce chapitre, il est fait référence à Promise lorsque seulesdes méthodes standards et compatibles avec l'implémentation officielle sontutilisées (compatibles avec ES6 et la majorité des implémentations), et à Blue-bird lorsque nous utilisons certaines de ses méthodes spécifiques.

Page 16: Node.js - Exploitez la puissance de JavaScript côté ...multimedia.fnac.com/multimedia/editorial/pdf/9782746089785.pdf · 39 € ISBN : 978-2-7460-8978-5 Node.js - Exploitez la puissance

© E

dit

ions

EN

I -

All r

ights

rese

rved

108Exploitez la puissance de JavaScript côté serveur

Node.js

3.1 États d'une promesse

Une promesse est dans un état, et un seul. Les états possibles sont :

– en attente (pending), quand l'opération asynchrone n'est pas terminée.

– remplie (fulfilled), quand l'opération est terminée avec succès.

– rejetée (rejected), quand l'opération a échoué.

Une fois que la promesse est remplie ou rejetée, elle ne change plus jamais.

3.2 Similarité avec du code synchrone

Un des objectifs des promesses est de rendre le code asynchrone le plus facileà écrire pour un développeur. L'idée est donc qu'il se rapproche le plus possibledu code synchrone.

Voici un code synchrone qui lit un fichier JSON, décode son contenu puis,après l'avoir modifié, le réécrit :

try { var config = JSON.parse(fs.readFileSync('config.json'));

config.foo = 'bar';

fs.writeFile('config.json', JSON.stringify(config));} catch (error) { console.error('Erreur :', error);}

Et voici une version asynchrone basée sur les promesses :

var readFile = Bluebird.promisify(fs.readFile);

var writeFile = Bluebird.promisify(fs.writeFile);

readFile('config.json').then(JSON.parse).then(function (config) {

config.foo = 'bar';

return writeFile('config.json', JSON.stringify(config));

}).catch(function (error) {

console.error('Erreur :', error);

});