0% ont trouvé ce document utile (0 vote)
0 vues416 pages

FullNodeCourse

Ce document présente une introduction à Node.js, une plateforme de développement JavaScript côté serveur, ainsi que des instructions sur son installation et l'utilisation de npm (Node Package Manager). Il aborde également l'historique, les avantages et inconvénients de Node.js, ainsi que des conseils pour l'utilisation de Visual Studio Code comme IDE. Enfin, il fournit des informations sur la gestion des paquets et la configuration de projets Node.js.

Transféré par

delnepro
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
0 vues416 pages

FullNodeCourse

Ce document présente une introduction à Node.js, une plateforme de développement JavaScript côté serveur, ainsi que des instructions sur son installation et l'utilisation de npm (Node Package Manager). Il aborde également l'historique, les avantages et inconvénients de Node.js, ainsi que des conseils pour l'utilisation de Visual Studio Code comme IDE. Enfin, il fournit des informations sur la gestion des paquets et la configuration de projets Node.js.

Transféré par

delnepro
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Node.

js : introduction

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel

[Link]@[Link]

H & H: Research and Training 1 / 62


Plan

1 Introduction
2 Installation
[Link]
Visual Studio Code
3 npm
Initialisation
Installation
Désinstallation
Mise à jour
Recherche
Consultation
Exécution
Autres commandes

H & H: Research and Training 2 / 62


Plan

4 nvm
Initialisation nvm
Version nvm
Installation de [Link] avec nvm
Désinstallation de [Link] avec nvm
Lister les versions installées de [Link]
Utilisation d’une version spécifique de [Link]

5 npx

H & H: Research and Training 3 / 62


Introduction

[Link]

On écrit
H I ©
[Link] et [Link]
UEL
O
ou aussi NodeJS
f E LM
ou encore Node et node
ch r e
©A

H & H: Research and Training 4 / 62


Introduction

[Link]

[Link]

Plateforme de développement (ou environnement d’exécution) :


ensemble de librairies JavaScript
H I ©
Créé par Ryan Lienhart Dahl en 2010
U EL
O
des tâches comme : f E LM
Permettant l’exécution de JavaScript côté serveur et de réaliser

r e
hdonnées
Persistancecde
A
© de fichiers
Manipulation
Sécurité
...

H & H: Research and Training 5 / 62


Introduction

[Link]

[Link] : histoire

2009 : Création de [Link] par Ryan Dahl, un développeur, en réponse aux limitations
des modèles d’E/S bloquantes dans les applications web traditionnelles.

2010 : Première version stable de [Link] (v0.1.14)


H I ©
U EL
2011 : Première version de npm (Node Package Manager) simplifiant la gestion des
O
LM
dépendances dans les projets [Link].

e f E
2012 : [Link] est utilisé par de grandes entreprises, notamment PayPal et LinkedIn.
r
ch
©A
...

2018 : Création de Deno par Ryan Dahl en réponse à certaines lacunes perçues de
[Link]. Deno a été annoncé lors d’une présentation intitulée 10 Things I Regret About
[Link]

...

H & H: Research and Training 6 / 62


Introduction

[Link]

[Link] : panorama

Utilisations courantes :

développement de serveurs web et d’applications côté serveur, notamment des API REST,

I ©
des applications en temps réel (comme les chats en direct et les jeux en ligne),

H
EL
des serveurs de fichiers,

des microservices.

O U
f E LM
Écosystème riche : [Link] dispose d’une vaste bibliothèque de modules et de packages, gérés via npm.

r e
Développement côté serveur : [Link] a introduit un modèle asynchrone non bloquant qui permet de gérer

ch
efficacement de nombreuses connexions simultanées.

©A
Framework et outils : Plusieurs frameworks et outils ont été développés autour de [Link] pour simplifier le
développement, notamment [Link], [Link], Ionic, Electron (pour le développement d’applications de bureau
multiplateformes).

Adoption par les grandes entreprises : Netflix, Airbnb, Uber utilisent [Link] pour des applications critiques, profitant
de ses performances et de sa flexibilité.

...

H & H: Research and Training 7 / 62


Introduction

[Link]

[Link] : avantages

Performances élevées : Grâce à son modèle non bloquant et à sa gestion


efficace des E/S
H I ©
U ELréel,simultan
Évolutivité : Grâce à sa gestion efficace des connexions ées, [Link]
est la plateforme idéale pour les applications
M O en temps les chats en direct,
les jeux en ligne...
f E L
e
chrtiers disponibles
Écosystème riche et communaut é active : une vaste bibliothèque de
modules et de A packages via npm
©
Utilisation du même langage côté client et côté serveur : JavaScript

...

H & H: Research and Training 8 / 62


Introduction

[Link]

[Link] : inconvénients

H I ©
Complexité du code : Le modèle de callbacks peut conduire à une structure de
code complexe et à des enchevêtrements de callbacks (callback hell).

U EL
O
Gestion des erreurs : La gestion des erreurs peut être compliquée dans

f E LM
[Link] en raison de la nature asynchrone des opérations.

ch r e
Monoprocessus : Par défaut, [Link] s’exécute dans un seul processus, ce qui

©A
signifie qu’il ne peut pas tirer pleinement parti des processeurs multi-cœurs sans
l’utilisation de modules complémentaires

...

H & H: Research and Training 9 / 62


Introduction

[Link]

Remarque
H I ©
UEL
Pour vérifier la compatibilité de [Link] avec une version ES20** :
O
aller à [Link]
f E LM
ch r e
Pas besoin d’utiliser un traducteur comme Babel.

©A

H & H: Research and Training 10 / 62


Installation [Link]

[Link]
Pour [Link], il faut

aller à [Link]

choisir la dernière version, télécharger et installer

H I ©
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 11 / 62


Installation [Link]

[Link]
Pour [Link], il faut

aller à [Link]

choisir la dernière version, télécharger et installer

H I ©
U EL
O
f E LM
ch r e
Pour vérifier la version installée

©A
node --version

H & H: Research and Training 11 / 62


Installation [Link]

[Link]
Pour [Link], il faut

aller à [Link]

choisir la dernière version, télécharger et installer

H I ©
U EL
O
f E LM
ch r e
Pour vérifier la version installée

©A
node --version

Ou

node -v

H & H: Research and Training 11 / 62


Installation Visual Studio Code

[Link]

Quel IDE (Environnement de développement intégré) pour [Link] ?

H I ©
Visual Studio Code (À ne pas confondre avec Visual Studio)
U EL
O
Visual Studio
f E LM
Eclipse
ch r e
... ©A

H & H: Research and Training 12 / 62


Installation Visual Studio Code

[Link]

Visual Studio Code (ou VSC) , pourquoi ?


Gratuit
Multi-langage
H I ©
EL
Multi-système d’exploitation
M OU
Extensible via l’installationE
f Lquelques centaines d’extensions
de

chr e
© A

H & H: Research and Training 13 / 62


Installation Visual Studio Code

[Link]

Visual Studio Code (ou VSC) , pourquoi ?


Gratuit
Multi-langage
H I ©
EL
Multi-système d’exploitation
M OU
Extensible via l’installationE
f Lquelques centaines d’extensions
de

chr e
© A
VSC : téléchargement
[Link]/download

H & H: Research and Training 13 / 62


Installation Visual Studio Code

[Link]

Quelques raccourcis VSC

Pour activer la sauvegarde automatique : aller dans File > AutoSave

H I ©
Pour indenter son code : Alt Shift f
U EL
O
Pour commenter/décommenter : Ctrl

f E L M:
ch r e
Pour sélectionner toutes les occurrences : Ctrl f2

©A
Pour sélectionner l’occurrence suivante : Ctrl d

Pour placer le curseur dans plusieurs endroits différents : Alt

H & H: Research and Training 14 / 62


Installation Visual Studio Code

[Link]

Démarche

Créez un répertoire cours-node dans votre espace de travail

Lancez VSC et allez dans File > Open Folder... et choisissez cours-node

H I ©
EL
Dans cours-node, créez un fichier [Link]

O U
f E LM
ch r e
©A

H & H: Research and Training 15 / 62


Installation Visual Studio Code

[Link]

Démarche

Créez un répertoire cours-node dans votre espace de travail

Lancez VSC et allez dans File > Open Folder... et choisissez cours-node

H I ©
EL
Dans cours-node, créez un fichier [Link]

O U
f
Ajoutons le contenu suivant à [Link] E LM
ch r e
©A
[Link]("Hello world");

H & H: Research and Training 15 / 62


Installation Visual Studio Code

[Link]

Démarche

Créez un répertoire cours-node dans votre espace de travail

Lancez VSC et allez dans File > Open Folder... et choisissez cours-node

H I ©
EL
Dans cours-node, créez un fichier [Link]

O U
f
Ajoutons le contenu suivant à [Link] E LM
ch r e
©A
[Link]("Hello world");

Pour exécuter, lancez la commande

node [Link]

H & H: Research and Training 15 / 62


npm

[Link]

npm : Node Package Manager

H I ©
Gestionnaire officiel de paquets [Link] (modules de la

EL
communauté)

O U
LM
Gestionnaire de dépendances

r e
Créé par Isaac Z. Schlueter f E
ch
©A
Installé automatiquement avec [Link]
Documentation officielle : [Link]

H & H: Research and Training 16 / 62


npm

[Link]

Autres gestionnaires de paquet pour [Link]


H I ©
Bower
UEL
O
Yarn
f ELM
...
ch r e
©A

H & H: Research and Training 17 / 62


npm

[Link]

Pour vérifier la version installée de npm

H I ©
EL
npm --version

O U
f ELM
ch r e
©A

H & H: Research and Training 18 / 62


npm

[Link]

Pour vérifier la version installée de npm

H I ©
EL
npm --version

O U
f ELM
Ou
ch r e
npm -v ©A

H & H: Research and Training 18 / 62


npm

[Link]

Autres gestionnaires de paquets pour [Link]


H I ©
Yarn
UEL
O
Bower
f ELM
...
ch r e
©A

H & H: Research and Training 19 / 62


npm Initialisation

[Link]

Pour configurer (initialiser) un nouveau projet ou un projet


existant
npm init
H I ©
U EL
O
f ELM
Ensuite
ch r e
©A
Répondre aux différentes questions
Vérifier la génération d’un fichier [Link]

H & H: Research and Training 20 / 62


npm Initialisation

[Link]

Exemple du contenu de [Link]


{
"name": "cours-nodejs-intro",
"version": "1.0.0",
H I ©
"description": "",
U EL
"main": "[Link]",
O
"scripts": {
f ELM
"test": "echo \"Error: no test specified\" && exit 1"
},
ch r e
"keywords": [],
"author": "", ©A
"license": "ISC"
}

H & H: Research and Training 21 / 62


npm Initialisation

[Link]

Pour initialiser un nouveau projet ou un projet existant sans


répondre aux questions
H I ©
npm init --yes
U EL
O
f ELM
ch r e
©A

H & H: Research and Training 22 / 62


npm Initialisation

[Link]

Pour initialiser un nouveau projet ou un projet existant sans


répondre aux questions
H I ©
npm init --yes
U EL
O
f ELM
ch r e
Ou
© A
npm init -y

H & H: Research and Training 22 / 62


npm Installation

[Link]

Deux types d’installation


Installation globale d’un package ⇒
package ajouté dans
H I ©
U
C:\Users\admin\AppData\Roaming\npm\node modulesEL
O
f E LM
package pouvant être utilisé dans tout autre projet [Link].

r e
Installation locale d’un package ⇒
ch
©A
package ajouté dans node modules du projet
package pouvant seulement être utilisé dans le projet actuel.
possibilité de déclarer le package installé dans [Link]

H & H: Research and Training 23 / 62


npm Installation

[Link]

Pour installer globalement un package


npm install --global nom-package H I ©
UEL
O
f ELM
ch r e
©A

H & H: Research and Training 24 / 62


npm Installation

[Link]

Pour installer globalement un package


npm install --global nom-package H I ©
UEL
O
f ELM
Ou
ch r e
©A
npm install -g nom-package

H & H: Research and Training 24 / 62


npm Installation

[Link]

Avant npm 5, pour installer localement un package et le déclarer dans la section


dependencies de [Link]

npm install --save nom-package

H I ©
UEL
O
f ELM
ch r e
©A

H & H: Research and Training 25 / 62


npm Installation

[Link]

Avant npm 5, pour installer localement un package et le déclarer dans la section


dependencies de [Link]

npm install --save nom-package

H I ©
UEL
O
LM
Ou

npm install -S nom-package


r e f E
ch
©A

H & H: Research and Training 25 / 62


npm Installation

[Link]

Avant npm 5, pour installer localement un package et le déclarer dans la section


dependencies de [Link]

npm install --save nom-package

H I ©
UEL
O
LM
Ou

npm install -S nom-package


r e f E
ch
©A
Avant npm 5, sans les options --save et -S, le package installé ne sera pas
déclaré dans [Link]

npm install nom-package

H & H: Research and Training 25 / 62


npm Installation

[Link]

Depuis npm 5, pour installer localement un package et le déclarer


dans la section dependencies de [Link]
npm install --save-prod nom-package

H I ©
UEL
O
f ELM
ch r e
©A

H & H: Research and Training 26 / 62


npm Installation

[Link]

Depuis npm 5, pour installer localement un package et le déclarer


dans la section dependencies de [Link]
npm install --save-prod nom-package

H I ©
UEL
O
Ou
f ELM
npm install -P nom-package
ch r e
©A

H & H: Research and Training 26 / 62


npm Installation

[Link]

Depuis npm 5, pour installer localement un package et le déclarer


dans la section dependencies de [Link]
npm install --save-prod nom-package

H I ©
UEL
O
Ou
f ELM
npm install -P nom-package
ch r e
©A
Ou tout simplement
npm install nom-package

H & H: Research and Training 26 / 62


npm Installation

[Link]
A l’installation d’une première dépendance locale

un [Link] sera généré

H I ©
un dossier node modules sera ajouté pour stocker les dépendances

UEL
O
f ELM
ch r e
©A

H & H: Research and Training 27 / 62


npm Installation

[Link]
A l’installation d’une première dépendance locale

un [Link] sera généré

H I ©
un dossier node modules sera ajouté pour stocker les dépendances

UEL
O
f ELM
[Link]
ch r e
©A
Introduit depuis npm 5

Contenant l’arborescence exacte des dépendances installées : Si on


installe la version 2 d’un package X qui dépend de la version 5 d’un
package Y, alors X et Y seront tous les deux mentionnés dans
[Link] ainsi que leur version.

H & H: Research and Training 27 / 62


npm Installation

[Link]

Pour installer localement un package sans le déclarer dans [Link]

npm install --no-save nom-package

H I ©
UEL
O
f ELM
ch r e
©A

H & H: Research and Training 28 / 62


npm Installation

[Link]

Pour installer localement un package sans le déclarer dans [Link]

npm install --no-save nom-package

H I ©
U ELdevDependencies
Pour installer localement un package et le déclarer dans
dans [Link]
L MO
r e f E
npm install --save-dev nom-package

A ch
©

H & H: Research and Training 28 / 62


npm Installation

[Link]

Pour installer localement un package sans le déclarer dans [Link]

npm install --no-save nom-package

H I ©
U ELdevDependencies
Pour installer localement un package et le déclarer dans
dans [Link]
L MO
r e f E
npm install --save-dev nom-package

A ch
©
Pour installer localement un package et le déclarer dans devDependencies
dans [Link]

npm install -D nom-package

H & H: Research and Training 28 / 62


npm Installation

[Link]

H I ©
EL
Remarque

O U
LM
La commande install a plusieurs alias autorisés : add, i, in, ins,

r e f E
inst, insta, instal, isnt, isnta, isntal, isntall.

ch
©A

H & H: Research and Training 29 / 62


npm Installation

[Link]

H I ©
Pour installer plusieurs packages
UEL
O
f ELM
npm install nom-package1 nom-package2 nom-package3

ch r e
©A

H & H: Research and Training 30 / 62


npm Installation

[Link]

H I ©
Pour installer les dépendances listées dans les sections
dependencies et devDependencies du [Link] UEL
O
npm install
f ELM
ch r e
©A

H & H: Research and Training 31 / 62


npm Désinstallation

[Link]
Pour désinstaller un package (et le supprimer de [Link])
npm uninstall nom-package

H I ©
U EL
O
f ELM
ch r e
©A

H & H: Research and Training 32 / 62


npm Désinstallation

[Link]
Pour désinstaller un package (et le supprimer de [Link])
npm uninstall nom-package

H I ©
U EL de
Pour désinstaller un package (sans le supprimer
[Link])
L MO
r e f E --no-save
ch
npm uninstall nom-package

© A

H & H: Research and Training 32 / 62


npm Désinstallation

[Link]
Pour désinstaller un package (et le supprimer de [Link])
npm uninstall nom-package

H I ©
U EL de
Pour désinstaller un package (sans le supprimer
[Link])
L MO
r e f E --no-save
ch
npm uninstall nom-package

© A
Pour désinstaller un package global
npm uninstall nom-package -g

H & H: Research and Training 32 / 62


npm Mise à jour

[Link]

Pour mettre à jour un package local


npm update nom-package
H I ©
UEL
O
f ELM
ch r e
©A

H & H: Research and Training 33 / 62


npm Mise à jour

[Link]

Pour mettre à jour un package local


npm update nom-package
H I ©
UEL
O
f ELM
r e
Pour mettre à jour tous les packages locaux (listés dans
ch
A
[Link]
©
npm update

H & H: Research and Training 33 / 62


npm Mise à jour

[Link]

Pour mettre à jour un package global


npm update nom-package -g H I ©
UEL
O
f ELM
ch r e
©A

H & H: Research and Training 34 / 62


npm Mise à jour

[Link]

Pour mettre à jour un package global


npm update nom-package -g H I ©
UEL
O
f ELM
ch r e
Pour mettre à jour tous les packages globaux
npm update -g ©A

H & H: Research and Training 34 / 62


npm Mise à jour

[Link]

Versions d’un module


Tout projet (ou package) [Link] peut évoluer
H I ©
U
Et on marque cette évolution par des num E L
éros de version souvent
écrits : x.y.z
L MO
r e f E (patch)
z : numéro de la correction

A
y : version ch
mineure
©
x : version majeure

H & H: Research and Training 35 / 62


npm Mise à jour

[Link]

Considérons le contenu suivant de la section dependencies de [Link]

"dependencies": {
"mongoose": "ˆ4.6.7",
"mysql": "˜2.3.0"
}

H I ©
UEL
O
f ELM
ch r e
©A

H & H: Research and Training 36 / 62


npm Mise à jour

[Link]

Considérons le contenu suivant de la section dependencies de [Link]

"dependencies": {
"mongoose": "ˆ4.6.7",
"mysql": "˜2.3.0"
}

H I ©
UEL
O
Explication
f E LM
ch r e
©A
"ˆ4.6.7" : signifie que la version doit être supérieure ou égale à 4.6.7, mais inférieure à
5.0.0. Par exemple, cela autorise l’installation des versions 4.6.7, 4.7.0, 4.8.2, mais pas
5.0.0.

"∼2.3.0" : signifie que la version doit être supérieure ou égale à 2.3.0, mais inférieure à
2.4.0. Par exemple, cela autorise l’installation des versions 2.3.0, 2.3.1, 2.3.9, mais pas
2.4.0.

H & H: Research and Training 36 / 62


npm Mise à jour

[Link]

H I ©
Lancer la commande suivante
UEL
O
npm install
f ELM
ch r e
©A

H & H: Research and Training 37 / 62


npm Mise à jour

[Link]

Constats
Aller dans node modules/mongoose/[Link] et vérifier
que 4.13.21 est la version installée.
H I ©
EL
Aller dans node modules/mysql/[Link] et vérifier
U
que 2.3.2 est la version installée.
O
f ELM
ch r e
©A

H & H: Research and Training 38 / 62


npm Mise à jour

[Link]

Constats
Aller dans node modules/mongoose/[Link] et vérifier
que 4.13.21 est la version installée.
H I ©
EL
Aller dans node modules/mysql/[Link] et vérifier
U
que 2.3.2 est la version installée.
O
f ELM
ch r e
Explication ©A
4.13.21 est la dernière version avant 5.0.0
2.3.2 est la dernière version avant 2.4.0

H & H: Research and Training 38 / 62


npm Mise à jour

[Link]

Pour lister les modules qui ne sont pas à jour


npm outdated
H I ©
UEL
O
f ELM
ch r e
©A

H & H: Research and Training 39 / 62


npm Mise à jour

[Link]

Pour lister les modules qui ne sont pas à jour


npm outdated
H I ©
UEL
O
f E LM
Résultat

ch r e
©A
Package Current Wanted Latest Location Depended by
mongoose 4.13.21 4.13.21 8.0.1 node_modules/mongoose cours-nodejs
mysql 2.3.2 2.3.2 2.18.1 node_modules/mysql cours-nodejs

H & H: Research and Training 39 / 62


npm Recherche

[Link]

Pour chercher un module selon un mot-clé


npm search mot-clé
H I ©
UEL
O
f ELM
ch r e
©A

H & H: Research and Training 40 / 62


npm Recherche

[Link]

Pour chercher un module selon un mot-clé


npm search mot-clé
H I ©
UEL
O
f ELM
Remarque
ch r e
©A
On peut aussi chercher sur [Link]

H & H: Research and Training 40 / 62


npm Consultation

[Link]

Pour lister les modules locaux


npm ls
H I ©
U EL
O
f ELM
ch r e
©A

H & H: Research and Training 41 / 62


npm Consultation

[Link]

Pour lister les modules locaux


npm ls
H I ©
U EL
O
f ELM
ch
Pour lister les modules globaux r e
npm ls -g ©A

H & H: Research and Training 41 / 62


npm Exécution

[Link]

Considérons le contenu suivant de [Link]


[Link]("Hello from [Link]");

H I ©
UEL
O
f ELM
ch r e
©A

H & H: Research and Training 42 / 62


npm Exécution

[Link]

Considérons le contenu suivant de [Link]


[Link]("Hello from [Link]");

H I ©
Et le contenu de public/[Link]
UEL
O
LM
[Link]("Hello from [Link]");

r e f E
ch
©A

H & H: Research and Training 42 / 62


npm Exécution

[Link]

Considérons le contenu suivant de [Link]


[Link]("Hello from [Link]");

H I ©
Et le contenu de public/[Link]
UEL
O
LM
[Link]("Hello from [Link]");

r e f E
ch
Remarque
©A
Pour associer une commande npm à l’exécution d’une commande, il faut
déclarer cette dernière dans la section scripts de [Link]

H & H: Research and Training 42 / 62


npm Exécution

Dans [Link], déclarons les deux commandes dans la section scripts

"scripts": {
"start": "node [Link]",
"serve": "node public/[Link]"
}

H I ©
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 43 / 62


npm Exécution

Dans [Link], déclarons les deux commandes dans la section scripts

"scripts": {
"start": "node [Link]",
"serve": "node public/[Link]"
}

Pour exécuter la commande associée à la section serve

H I ©
npm run serve
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 43 / 62


npm Exécution

Dans [Link], déclarons les deux commandes dans la section scripts

"scripts": {
"start": "node [Link]",
"serve": "node public/[Link]"
}

Pour exécuter la commande associée à la section serve

H I ©
npm run serve
UEL
O
f E LM
ch r e
Pour exécuter la commande associée à la section start

npm run start ©A

H & H: Research and Training 43 / 62


npm Exécution

Dans [Link], déclarons les deux commandes dans la section scripts

"scripts": {
"start": "node [Link]",
"serve": "node public/[Link]"
}

Pour exécuter la commande associée à la section serve

H I ©
npm run serve
UEL
O
f E LM
ch r e
Pour exécuter la commande associée à la section start

npm run start ©A


Pour la section start, on peut tout simplement faire

npm start

H & H: Research and Training 43 / 62


npm Exécution

[Link]

Pour exécuter la commande définie dans la section start


(définie dans scripts) de [Link]

H I ©
EL
npm start

O U
f ELM
ch r e
©A

H & H: Research and Training 44 / 62


npm Exécution

[Link]

Pour exécuter la commande définie dans la section start


(définie dans scripts) de [Link]

H I ©
EL
npm start

O U
f ELM
ch r e
Pour exécuter la commande définie dans la section stop (définie
©A
dans scripts) de [Link]
npm stop

H & H: Research and Training 44 / 62


npm Autres commandes

[Link]

Pour avoir de l’aide sur une commande


npm help nom-commande
H I ©
U EL
O
f ELM
ch r e
©A

H & H: Research and Training 45 / 62


npm Autres commandes

[Link]

Pour avoir de l’aide sur une commande


npm help nom-commande
H I ©
U EL
O
f ELM
ch r
Pour avoir de l’aide sur un packagee
npm view nom-package©A

H & H: Research and Training 45 / 62


nvm

[Link]

nvm : Node Version Manager

Gestionnaire de versions pour [Link] : permettant de travailler


avec plusieurs versions de [Link]
H I ©
Disponible pour Windows, Mac OS et Linux
U EL
Conçu initialement pour MacLOSM
O
r e f E et Linux ensuite pour Windows

A ch
Deux dépôts GitHub diff érents :
Pour©Mac OS et Linux : [Link]
Pour Windows :
[Link]

H & H: Research and Training 46 / 62


nvm

[Link]

Autres gestionnaires de versions pour [Link]


H I ©
U EL
nvs (Node Version Switcher) : [Link]

L MO
Volta : [Link]

r e f E
...
A ch
©

H & H: Research and Training 47 / 62


nvm Initialisation nvm

[Link]

Installation sous Windows


H I ©
U EL
MO
Aller à [Link]

f E
Choisir un format, télécharger puisLinstaller

ch r e
© A

H & H: Research and Training 48 / 62


nvm Initialisation nvm

[Link]

Installation sous Mac OS et Linux : 3 solutions

H I ©
EL
Soit en téléchargeant et exécutant le script Shell du lien suivant :
U
MO
[Link]

Soit en exécutant la commandeE L


ref
curl

la h
Soit en exécutant c
©A
commande wget

H & H: Research and Training 49 / 62


nvm Initialisation nvm

[Link]

Deuxième solution avec tt curl

curl -o- [Link] | bash

H I ©
U EL
O
f ELM
ch r e
©A

H & H: Research and Training 50 / 62


nvm Initialisation nvm

[Link]

Deuxième solution avec tt curl

curl -o- [Link] | bash

H I ©
U EL
O
LM
Troisième solution avec wget

f E
wget -qO- [Link] | bash

r e
ch
©A

H & H: Research and Training 50 / 62


nvm Initialisation nvm

[Link]

Deuxième solution avec tt curl

curl -o- [Link] | bash

H I ©
U EL
O
LM
Troisième solution avec wget

f E
wget -qO- [Link] | bash

r e
ch
©A
Quel que soit votre OS

Redémarrer le terminal (console)

H & H: Research and Training 50 / 62


nvm Version nvm

[Link]

Pour connaitre la version installée de nvm

H I ©
EL
nvm --version

O U
f ELM
ch r e
©A

H & H: Research and Training 51 / 62


nvm Version nvm

[Link]

Pour connaitre la version installée de nvm

H I ©
EL
nvm --version

O U
f ELM
Ou
ch r e
nvm -v ©A

H & H: Research and Training 51 / 62


nvm Installation de [Link] avec nvm

[Link]

Pour installer la dernière version (lts) de [Link] (sous Windows)

nvm install lts

H I ©
U EL
O
f ELM
ch r e
©A

H & H: Research and Training 52 / 62


nvm Installation de [Link] avec nvm

[Link]

Pour installer la dernière version (lts) de [Link] (sous Windows)

nvm install lts

H I ©
U EL
O
LM
Pour installer la dernière version (lts) de [Link] (sous Mac et Linux)

nvm install --lts


r e f E
ch
©A

H & H: Research and Training 52 / 62


nvm Installation de [Link] avec nvm

[Link]

Pour installer la dernière version (lts) de [Link] (sous Windows)

nvm install lts

H I ©
U EL
O
LM
Pour installer la dernière version (lts) de [Link] (sous Mac et Linux)

nvm install --lts


r e f E
ch
©A
Pour installer une version spécifique

nvm install 14.7.0

H & H: Research and Training 52 / 62


nvm Désinstallation de [Link] avec nvm

[Link]

H I ©
Pour désinstaller une version spécifique
U EL
O
nvm uninstall 14.7.0
f ELM
ch r e
©A

H & H: Research and Training 53 / 62


nvm Lister les versions installées de [Link]

[Link]

Pour lister les versions installer de [Link]


nvm list

H I ©
U EL
O
f ELM
ch r e
©A

H & H: Research and Training 54 / 62


nvm Lister les versions installées de [Link]

[Link]

Pour lister les versions installer de [Link]


nvm list

H I ©
U EL
Ou
O
nvm ls
f ELM
ch r e
©A

H & H: Research and Training 54 / 62


nvm Lister les versions installées de [Link]

[Link]

Pour lister les versions installer de [Link]


nvm list

H I ©
U EL
Ou
O
nvm ls
f ELM
ch r e
©A
Résultat (exemple)

* 18.12.1 (Currently using 64-bit executable)


14.7.0

H & H: Research and Training 54 / 62


nvm Lister les versions installées de [Link]

[Link]

H I ©
EL pour installation
Pour consulter la liste des versions disponibles
U
nvm list available
L MO
r e f E
A ch
©

H & H: Research and Training 55 / 62


nvm Utilisation d’une version spécifique de [Link]

[Link]

Pour utiliser une version spécifique


nvm use 14.7.0
H I ©
U EL
O
f ELM
ch r e
©A

H & H: Research and Training 56 / 62


nvm Utilisation d’une version spécifique de [Link]

[Link]

Pour utiliser une version spécifique


nvm use 14.7.0
H I ©
U EL
O
f ELM
Pour vérifier
ch r e
18.12.1
©A
* 14.7.0 (Currently using 64-bit executable)

H & H: Research and Training 56 / 62


nvm Utilisation d’une version spécifique de [Link]

[Link]

Pour utiliser la dernière version (lts)

H I ©
EL
nvm use latest

O U
f ELM
ch r e
©A

H & H: Research and Training 57 / 62


nvm Utilisation d’une version spécifique de [Link]

[Link]

Pour utiliser la dernière version (lts)

H I ©
EL
nvm use latest

O U
f ELM
Ou
ch r e
nvm use lts ©A

H & H: Research and Training 57 / 62


npx

[Link]

npx : Node Package eXecute


H I ©
EL
OU
Outil d’exécution de paquets [Link]
M
f
Automatiquement installéE L [Link]
avec
chr e
© A

H & H: Research and Training 58 / 62


npx

[Link]

Commençons par installer globalement le paquet cowsay


npm install -g cowsay

H I ©
UEL
O
f ELM
ch r e
©A

H & H: Research and Training 59 / 62


npx

[Link]

Commençons par installer globalement le paquet cowsay


npm install -g cowsay

H I ©
U EL
O
LM
Pour vérifier que le paquet a bien été installé
npm list -g
r e f E
ch
©A

H & H: Research and Training 59 / 62


npx

[Link]

Commençons par installer globalement le paquet cowsay


npm install -g cowsay

H I ©
U EL
O
LM
Pour vérifier que le paquet a bien été installé
npm list -g
r e f E
ch
©A
Pour lancer le paquet
cowsay salut

H & H: Research and Training 59 / 62


npx

[Link]

Désinstallons ce paquet cowsay


npm uninstall -g cowsay H I ©
UEL
O
f ELM
ch r e
©A

H & H: Research and Training 60 / 62


npx

[Link]

Désinstallons ce paquet cowsay


npm uninstall -g cowsay H I ©
UEL
O
f ELM
ch r e
Pour vérifier que le paquet a bien été désinstallé
npm list -g ©A

H & H: Research and Training 60 / 62


npx

[Link]

Pour lancer le paquet cowsay sans qu’il soit installé


npx cowsay salut

H I ©
UEL
O
f ELM
ch r e
©A

H & H: Research and Training 61 / 62


npx

[Link]

Pour lancer le paquet cowsay sans qu’il soit installé


npx cowsay salut

H I ©
UEL
O
LM
Vérifier que le paquet n’a pas été réinstallé en global
npm list -g
r e f E
ch
©A

H & H: Research and Training 61 / 62


npx

[Link]

Pour lancer le paquet cowsay sans qu’il soit installé


npx cowsay salut

H I ©
UEL
O
LM
Vérifier que le paquet n’a pas été réinstallé en global
npm list -g
r e f E
ch
©A
Ni en local
npm list

H & H: Research and Training 61 / 62


npx

[Link]

Question
Peut-on utiliser npx avec tous les packages [Link] ?
H I ©
UEL
O
f ELM
ch r e
©A

H & H: Research and Training 62 / 62


npx

[Link]

Question
Peut-on utiliser npx avec tous les packages [Link] ?
H I ©
U EL
O
f ELM
Réponse
ch r e
©A
On peut utiliser la commande npx avec les packages npm incluant
des scripts spécifiés dans leur fichier [Link] qui peuvent être
exécutés à l’aide de la commande npm run.

H & H: Research and Training 62 / 62


[Link] : modules et promesses

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel

[Link]@[Link]

H & H: Research and Training 1 / 55


Plan

1 CommonJS
exports
require
Importation multiple
Module ES6 ou ESModule

2 ESModule
export
import
as
default

H & H: Research and Training 2 / 55


Plan

3 ESModule et CommonJS

4 Callback

5 Promesse
finally
async
await
Chaı̂nage de then
[Link]

6 Callbacks vs promesses

H & H: Research and Training 3 / 55


CommonJS

[Link]
Trois types de modules

Core modules : définis dans le noyau du [Link]. Pour les


utiliser, il faut les importer.

H I ©
Community modules : proposés par la communauté [Link].
U EL
Pour les utiliser, il faut les installer et ensuite les importer.
M O
f E L les utiliser, il faut les exporter puis
Modules personnalisés : pour
les importer.
c h re
©A

H & H: Research and Training 4 / 55


CommonJS

[Link]
Trois types de modules

Core modules : définis dans le noyau du [Link]. Pour les


utiliser, il faut les importer.

H I ©
Community modules : proposés par la communauté [Link].
U EL
Pour les utiliser, il faut les installer et ensuite les importer.
M O
f E L les utiliser, il faut les exporter puis
Modules personnalisés : pour
les importer.
c h re
©A
Remarque

Dans ce chapitre, nous traitons les modules personnalisés.

H & H: Research and Training 4 / 55


CommonJS

[Link]

Module
Un fichier pouvant contenir des variables, constantes, fonctions,
classes...

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 5 / 55


CommonJS

[Link]

Module
Un fichier pouvant contenir des variables, constantes, fonctions,
classes...

H I ©
U EL
O
Propriétés
f E LM
ch r e
Il est possible d’utiliser des éléments définis dans un autre fichier :
©A
variable, constante, fonction, classe...
Pour cela, il faut l’importer là où on a besoin de l’utiliser
Pour importer un élément, il faut l’exporter dans le fichier source

H & H: Research and Training 5 / 55


CommonJS

[Link]

Étant donné le fichier [Link] dont le contenu est


const somme = (a = 0, b = 0) => {
H I ©
return a + b;
UEL
}
O
f E LM
r
const produit = (a = 0, b = 1) => {
ch e
©A
return a * b;
}

H & H: Research and Training 6 / 55


CommonJS exports

[Link]

Pour exporter les deux fonctions somme et produit de


[Link] : première syntaxe
const somme = (a = 0, b = 0) => {
H I ©
EL
return a + b;
}
M OU
E
const produit = (a = f0, L = 1) => {
c hr
return a * b; e b

} © A
[Link] = { somme, produit }

H & H: Research and Training 7 / 55


CommonJS exports

[Link]

Deuxième syntaxe
[Link] = (a = 0, b = 0) => {
H I ©
return a + b;
UEL
}
O
f E LM
r e
[Link] = (a = 0, b = 1) => {
ch
©A
return a * b;
}

H & H: Research and Training 8 / 55


CommonJS exports

[Link]

Troisième syntaxe
[Link] = {
somme: (a = 0, b = 0) => {
H I ©
return a + b;
UEL
}, O
f E LM
ch r e
produit: (a = 0, b = 1) => {

} ©A
return a * b;

H & H: Research and Training 9 / 55


CommonJS require

[Link]
Pour importer et utiliser une fonction

const { somme } = require('./fonctions');

[Link](somme(2, 5));
// affiche 7
H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 10 / 55


CommonJS require

[Link]
Pour importer et utiliser une fonction

const { somme } = require('./fonctions');

[Link](somme(2, 5));
// affiche 7
H I ©
UEL
O
Pour importer plusieurs éléments
f E LM
ch r e
const { somme, produit } = require('./fonctions');

©A
[Link](somme(2, 5));
// affiche 7

[Link](produit(2, 5));
// affiche 10

H & H: Research and Training 10 / 55


CommonJS Importation multiple

[Link]

Pour tout importer dans une constante f


const f = require('./fonctions');
H I ©
U EL
[Link]([Link](2, 5));
O
// affiche 7
f E LM
ch r e
©
// affiche
A
[Link]([Link](2,
10
5));

H & H: Research and Training 11 / 55


CommonJS Importation multiple

[Link]
On peut aussi renommer les éléments exportés

const somme = (a = 0, b = 0) => {


return a + b;
}

const produit = (a = 0, b = 1) => {


H I ©
return a * b;
EL
}
M OU
f E L , produit }
[Link] = { addition: somme

chr e
© A

H & H: Research and Training 12 / 55


CommonJS Importation multiple

[Link]
On peut aussi renommer les éléments exportés

const somme = (a = 0, b = 0) => {


return a + b;
}

const produit = (a = 0, b = 1) => {


H I ©
return a * b;
EL
}
M OU
f E L , produit }
[Link] = { addition: somme

chr e
© A
Pour importer

const { addition } = require('./fonctions');

[Link](addition(2, 5));
// affiche 7

H & H: Research and Training 12 / 55


CommonJS Module ES6 ou ESModule

[Link]
Utilisons la syntaxe ES6 dans [Link]

const somme = (a = 0, b = 0) => {


return a + b;
}

const produit = (a = 0, b = 1) => {


return a * b;
H I ©
EL
}

export { somme, produit };


O U
f E LM
ch r e
©A

H & H: Research and Training 13 / 55


CommonJS Module ES6 ou ESModule

[Link]
Utilisons la syntaxe ES6 dans [Link]

const somme = (a = 0, b = 0) => {


return a + b;
}

const produit = (a = 0, b = 1) => {


return a * b;
H I ©
EL
}

export { somme, produit };


O U
f E LM
ch r e
©A
Et dans [Link]

import { somme, produit } from "./[Link]";

[Link](somme(2, 5));
// affiche 7

[Link](produit(2, 5));
// affiche 10

H & H: Research and Training 13 / 55


ESModule

[Link]
exports, require...

Syntaxe native de [Link] définie dans CommonJS : système de gestion de


module de [Link].

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 14 / 55


ESModule

[Link]
exports, require...

Syntaxe native de [Link] définie dans CommonJS : système de gestion de


module de [Link].

H I ©
UEL
O
LM
Question

e f E
Peut-on utiliser la syntaxe ES6 (import, export...) avec [Link] ?
r
ch
©A

H & H: Research and Training 14 / 55


ESModule

[Link]
exports, require...

Syntaxe native de [Link] définie dans CommonJS : système de gestion de


module de [Link].

H I ©
UEL
O
LM
Question

e f E
Peut-on utiliser la syntaxe ES6 (import, export...) avec [Link] ?
r
ch
©A
Réponse

Oui, depuis [Link] 13.2.0, avec un peu de configuration pour changer le


système natif de [Link]

H & H: Research and Training 14 / 55


ESModule

[Link]

Démarche
H I ©
U ELECMAScript
Privilégier l’extension .mjs pour les modules
Modifier la configuration par L MO
e f E défaut dans [Link] : ajouter

chr
"type": "module"

© A

H & H: Research and Training 15 / 55


ESModule

[Link]

Ajoutons "type": "module" pour remplacer CommonJS dans [Link]

{
"name": "cours-nodejs",
"version": "1.0.0",
"description": "",
H I ©
EL
"main": "[Link]",
"type": "module",
O U
LM
"dependencies": {
},
"devDependencies": {},
r e f E
ch
"scripts": {

©A
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}

H & H: Research and Training 16 / 55


ESModule

[Link]

Étant donné le fichier [Link] dont le contenu est


function somme(a, b) {
H I ©
return a + b;
UEL
}
O
f E LM
function produit(a, b) {
ch r e
©A
return a * b;
}

H & H: Research and Training 17 / 55


ESModule export

[Link]
Pour exporter les deux fonctions somme et produit de [Link]

export function somme(a, b) {


return a + b;
}

export function produit(a, b) {


return a * b;
H I ©
}
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 18 / 55


ESModule export

[Link]
Pour exporter les deux fonctions somme et produit de [Link]

export function somme(a, b) {


return a + b;
}

export function produit(a, b) {


return a * b;
H I ©
}
UEL
O
f E LM
Ou aussi

ch r e
©A
function somme(a, b) {
return a + b;
}

function produit(a, b) {
return a * b;
}
export { somme, produit };

H & H: Research and Training 18 / 55


ESModule import

[Link]
Pour importer et utiliser une fonction

import { somme } from './fonctions';

[Link](somme(2, 5));
// affiche 7
H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 19 / 55


ESModule import

[Link]
Pour importer et utiliser une fonction

import { somme } from './fonctions';

[Link](somme(2, 5));
// affiche 7
H I ©
UEL
O
Pour importer plusieurs éléments
f E LM
ch r e
import { somme, produit } from './fonctions';

©A
[Link](somme(2, 5));
// affiche 7

[Link](produit(2, 5));
// affiche 10

H & H: Research and Training 19 / 55


ESModule as

[Link]
On peut aussi utiliser des alias

import { somme as s, produit as p } from './fonctions';

[Link](s(2, 5));
// affiche 7

H I ©
EL
[Link](p(2, 5));
// affiche 10

O U
f E LM
ch r e
©A

H & H: Research and Training 20 / 55


ESModule as

[Link]
On peut aussi utiliser des alias

import { somme as s, produit as p } from './fonctions';

[Link](s(2, 5));
// affiche 7

H I ©
EL
[Link](p(2, 5));
// affiche 10

O U
f E LM
Ou aussi
ch r e
import
©A
* as f from './fonctions';

[Link]([Link](2, 5));
// affiche 7

[Link]([Link](2, 5));
// affiche 10

H & H: Research and Training 20 / 55


ESModule as

[Link]
Les alias peuvent être attribués à l’exportation

function somme(a, b) {
return a + b;
}

function produit(a, b) {
return a * b;
H I ©
}
export { produit as p, somme as s } ;
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 21 / 55


ESModule as

[Link]
Les alias peuvent être attribués à l’exportation

function somme(a, b) {
return a + b;
}

function produit(a, b) {
return a * b;
H I ©
}
export { produit as p, somme as s } ;
UEL
O
f E LM
Pour importer
ch r e
©A
import * as f from './fonctions';

[Link](f.s(2, 5));
// affiche 7

[Link](f.p(2, 5));
// affiche 10

H & H: Research and Training 21 / 55


ESModule default

[Link]
On peut aussi utiliser le export default (un seul par fichier)

export default function somme(a, b) {


return a + b;
}

export function produit(a, b) {


return a * b;
H I ©
}
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 22 / 55


ESModule default

[Link]
On peut aussi utiliser le export default (un seul par fichier)

export default function somme(a, b) {


return a + b;
}

export function produit(a, b) {


return a * b;
H I ©
}
U EL
O
f E LM
r e
Pour importer, pas besoin de { } pour les éléments exporter par défaut
ch
©A
import somme from './fonctions';
import { produit } from './fonctions';

[Link](somme(2, 5));
// affiche 7

[Link](produit(2, 5));
// affiche 10

H & H: Research and Training 22 / 55


ESModule default

[Link]

Attention, ici on a importé somme avec deux alias différents


import s from './fonctions';
import produit from './fonctions';
H I ©
UEL
O
LM
[Link](s(2, 5));
// affiche 7
r e f E
ch
©A
[Link](produit(2, 5));
// affiche 7

H & H: Research and Training 23 / 55


ESModule et CommonJS

[Link]

Question
Peut-on utiliser à la fois CommonJS et ESModule dans le même
projet ? H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 24 / 55


ESModule et CommonJS

[Link]

Question
Peut-on utiliser à la fois CommonJS et ESModule dans le même
projet ? H I ©
UEL
O
f E LM
Réponse ch r e
©A
ESModule et CommonJS sont mutuellement exclusifs, nous ne
pouvons donc pas utiliser les modules ES6 dans CommonJS.

H & H: Research and Training 24 / 55


ESModule et CommonJS

[Link]

Remarque

modules ES6.
H I ©
Les variables CommonJS comme filename et dirname ne sont pas accessibles dans les

UEL
O
f E LM
ch r e
©A

H & H: Research and Training 25 / 55


ESModule et CommonJS

[Link]

Remarque

modules ES6.
H I ©
Les variables CommonJS comme filename et dirname ne sont pas accessibles dans les

U EL
O
f E LM
ch r e
Depuis [Link] 21.2.0, on peut utiliser

©A
[Link] pour récupérer le chemin absolu vers le fichier courant

[Link] pour récupérer le chemin absolu vers le répertoire courant

H & H: Research and Training 25 / 55


Callback

[Link]
Fonction de retour (callback)

fonction appelée comme un paramètre d’une deuxième fonction


très utilisée en JavaScript (jQuery et [Link]) avec les fonctions
asynchrones
H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 26 / 55


Callback

[Link]
Fonction de retour (callback)

fonction appelée comme un paramètre d’une deuxième fonction


très utilisée en JavaScript (jQuery et [Link]) avec les fonctions
asynchrones
H I ©
UEL
O
f E LM
r e
Considérons les deux fonctions suivantes
ch
function
© A b) {
somme(a,
return a + b;
}
function produit(a, b) {
return a * b;
}

H & H: Research and Training 26 / 55


Callback

[Link]

Utilisons les fonctions précédentes comme callback d’une


fonction operation()

H I ©
EL
function operation(a, b, fonction) {
[Link] (fonction(a, b));
O U
}
f E LM
ch
// appeler la fonction opérationr e
©A
operation (3, 5, somme);
// affiche 8

H & H: Research and Training 27 / 55


Callback

[Link]

Exercice
H I ©
U ELdesdeux
Modifier la fonction opération pour qu’elle puisse accepter fonctions

M O
callback ensuite retourner le résultat de la composition deux.
L
E produit) retourne 30 = (2 + 3) * 6
fsomme,
Par exemple :
operation (2, 3h
c e
, r6,

©A

H & H: Research and Training 28 / 55


Callback

[Link]
Considérons la déclaration de la fonction JavaScript suivant qui calcule
le résultat de la division de deux nombres
const division = (a, b) => {
if (b === 0) {
throw "Problème de division par zéro";
}
H I ©
return a / b;
UEL
}
O
f E LM
ch r e
©A

H & H: Research and Training 29 / 55


Callback

[Link]
Considérons la déclaration de la fonction JavaScript suivant qui calcule
le résultat de la division de deux nombres
const division = (a, b) => {
if (b === 0) {
throw "Problème de division par zéro";
}
H I ©
return a / b;
U EL
}
O
f E LM
ch r e
A
L’appel de la fonction
©
[Link](division(10, 2));
// affiche 5

[Link](division(10, 0));
// affiche Problème de division par zéro

H & H: Research and Training 29 / 55


Callback

[Link]

Remarque
H I ©
U
En [Link], on utilise souvent les callback
L pour les
Esurtout
traitements asynchrones.
L MO
r e f E
en [Link] ont une signature similaire.
ch
Les fonctions callbacks

© A

H & H: Research and Training 30 / 55


Callback

Réécriture de la fonction division avec les callback

const division = (a, b, callback) => {


if (b !== 0) {
return callback(null, a / b);
}
return callback('Problème de division par zéro', null);
};

const a = 10, b = 0;
H I ©
division(a, b, (err, result) => {
UEL
O
LM
if (err) {

} else {
r e E
[Link]("erreur : " + err);
f
ch
[Link]( `${a} / ${b} = ${result}`);

©A
}
});
// affiche erreur : Problème de division par zéro

H & H: Research and Training 31 / 55


Callback

Réécriture de la fonction division avec les callback

const division = (a, b, callback) => {


if (b !== 0) {
return callback(null, a / b);
}
return callback('Problème de division par zéro', null);
};

const a = 10, b = 0;
H I ©
division(a, b, (err, result) => {
U EL
O
LM
if (err) {

} else {
r e E
[Link]("erreur : " + err);
f
ch
[Link]( `${a} / ${b} = ${result}`);

©A
}
});
// affiche erreur : Problème de division par zéro

Affecter la valeur 2 à b et vérifier que le bon résultat s’affiche.

H & H: Research and Training 31 / 55


Callback

[Link]

Conventions

H I ©
Les fonctions callback prennent au moins deux paramètres :
U EL
O
un premier paramètre err qui reste vide si la fonction a bien été
E LM
exécutée, sinon il contient le contenu du message d’erreur.
f
r e
ch ètre result qui contient le résultat si la
un deuxième param
n’a A
fonction© pas détecter d’erreurs.

H & H: Research and Training 32 / 55


Callback

[Link]

Exercice
Considérons les données suivantes :
H I ©
U EL
var tab = [1, 3, 6, 8, 9]; O
var element = 5;
f E LM
r e
ch qui permet de vérifier si element appartient à
A
Écrire une fonction
© dans ce cas sa position
tab et retourne

H & H: Research and Training 33 / 55


Callback

[Link]
Solution (avec callback)

const searchElement = (data, callback) => {


for (let i = 0; i < [Link]; i++) {
if ([Link][i] == [Link]) {
return callback(null, i);
}
}
H I ©
EL
return callback( `${[Link]} n'est pas dans tableau`);
};
O U
const tab = [1, 3, 6, 8, 9];
const element = 6;
f E LM
ch r e
const data = { tableau: tab, filtre: element };

©A
searchElement(data, (err, result) => {
if (err) {
[Link]("erreur :" + err);
} else {
[Link]( `${element} est dans le tableau à la position ${
result}`);
}
});

H & H: Research and Training 34 / 55


Callback

[Link]
Ou

const searchElement = function (tableau, elt, callback) {


for (let i = 0; i < [Link]; i++) {
if (tableau[i] == elt) {
return callback(null, i);
}
}
H I ©
EL
return callback( `${elt} n'est pas dans tableau`);
};
O U
const tab = [1, 3, 6, 8, 9];
const element = 6;
f E LM
ch r e
const data = { tableau: tab, filtre: element };

©A
searchElement(tab, element, (err, result) => {
if (err) {
[Link]("erreur :" + err);
} else {
[Link]( `${element} est dans le tableau à la position ${
result}`);
}
});

H & H: Research and Training 35 / 55


Callback

[Link]

Exercice 2

I ©
En utilisant les fonctions callback, écrire une fonction qui permet de
H
EL
déterminer le nombre d’occurrence d’une sous-chaı̂ne de caractère ch
U
dans une chaı̂ne de caractère str. O
ch = ab f E LM
ch r e
A
str = abbbaaaabaaabb
©
la fonction retourne 3.

H & H: Research and Training 36 / 55


Promesse

[Link]

Promesse
Introduite dans ES6

I ©
Utilisée souvent pour réaliser des traitements sur un résultat suite
H
à une opération asynchrone
U EL
O
f E LM
Disposant d’une première méthode then() permettant de traiter

ch r e
le résultat une fois l’opération accomplie

©A
Disposant d’une deuxième méthode catch() exécutée en cas
d’échec de l’opération
Comme les fonctions : composée de deux parties : déclaration et
utilisation

H & H: Research and Training 37 / 55


Promesse

Considérons la déclaration suivante d’une promesse

var test = true;


var promesse = new Promise((resolve, reject) => {
if (test)
resolve();
else
reject();
});

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 38 / 55


Promesse

Considérons la déclaration suivante d’une promesse

var test = true;


var promesse = new Promise((resolve, reject) => {
if (test)
resolve();
else
reject();
});

H I ©
U EL
O
(resolve) ou échec (reject)
f E LM
Dans la partie utilisation, on doit indiquer ce qu’il faut faire dans les deux cas : réussite

promesse
ch r e
©A
.then(() => [Link]("test réussi") )
.catch(() => [Link]("erreur") );
// affiche test réussi car test = true

H & H: Research and Training 38 / 55


Promesse

Considérons la déclaration suivante d’une promesse

var test = true;


var promesse = new Promise((resolve, reject) => {
if (test)
resolve();
else
reject();
});

H I ©
U EL
O
(resolve) ou échec (reject)
f E LM
Dans la partie utilisation, on doit indiquer ce qu’il faut faire dans les deux cas : réussite

promesse
ch r e
©A
.then(() => [Link]("test réussi") )
.catch(() => [Link]("erreur") );
// affiche test réussi car test = true

Le catch() n’est pas obligatoire.

H & H: Research and Training 38 / 55


Promesse

[Link]
Une promesse peut être déclarée avec une fonction fléchée
var test = true;
var promesse = () => {
return new Promise((resolve, reject) => {
if (test)
resolve();
H I ©
else
UEL
reject(); O
});
f E LM
};
ch r e
©A

H & H: Research and Training 39 / 55


Promesse

[Link]
Une promesse peut être déclarée avec une fonction fléchée
var test = true;
var promesse = () => {
return new Promise((resolve, reject) => {
if (test)
resolve();
H I ©
else
UEL
reject(); O
});
f E LM
};
ch r e
©A
Pour l’utilisation, il faut appeler promesse comme une fonction
promesse()
.then(() => [Link]("test réussi"))
.catch(() => [Link]("erreur"));

H & H: Research and Training 39 / 55


Promesse

[Link]

H I ©
Remarque
UEL
O
f E LM
Une promesse peut recevoir des paramètres et retourner un résultat

ch r e
©A

H & H: Research and Training 40 / 55


Promesse

[Link]
Exemple : déclaration

var division = (a, b) => {


return new Promise((resolve, reject) => {
if (b != 0)
resolve(a / b);
else
reject("erreur : division par zéro");
H I ©
EL
});
};

O U
f E LM
ch r e
©A

H & H: Research and Training 41 / 55


Promesse

[Link]
Exemple : déclaration

var division = (a, b) => {


return new Promise((resolve, reject) => {
if (b != 0)
resolve(a / b);
else
reject("erreur : division par zéro");
H I ©
EL
});
};

O U
f E LM
L’utilisation

ch r e
©A
division(10, 2)
.then((res) => [Link]("résultat : " + res))
.catch((error) => [Link](error));
// affiche résultat : 5

division(5, 0)
.then((res) => [Link]("résultat : " + res))
.catch((error) => [Link](error));
// affiche erreur : division par zéro

H & H: Research and Training 41 / 55


Promesse

[Link]
Remarque : les promesses s’exécutent d’une manière asynchrone

var division = (a: number, b: number) => {


return new Promise((resolve, reject) => {
if(b != 0)
resolve(a / b);
else
reject("erreur : division par zéro");

};
});

H I ©
division(10, 2)

UEL
O
.then((res) => [Link]("résultat : " + res))

LM
.catch((error) => [Link](error));

division(5, 0)

r e f E
.then((res) => [Link]("résultat : " + res))

ch
.catch((error) => [Link](error));

©A
[Link]("fin");

H & H: Research and Training 42 / 55


Promesse

[Link]
Remarque : les promesses s’exécutent d’une manière asynchrone

var division = (a: number, b: number) => {


return new Promise((resolve, reject) => {
if(b != 0)
resolve(a / b);
else
reject("erreur : division par zéro");

};
});

H I ©
division(10, 2)

UEL
O
.then((res) => [Link]("résultat : " + res))

LM
.catch((error) => [Link](error));

division(5, 0)

r e f E
.then((res) => [Link]("résultat : " + res))

ch
.catch((error) => [Link](error));

©A
[Link]("fin");

Le résultat est

fin
résultat : 5
erreur : division par zéro

H & H: Research and Training 42 / 55


Promesse finally

[Link]

finally
H I ©
Introduit dans ES2018
UEL
O
f E LM
Prenant comme paramètre une fonction callback appelée

rejetée. ch r e
lorsque l’exécution de la promesse est terminée : résolue ou

©A

H & H: Research and Training 43 / 55


Promesse finally

[Link]
Remarque : les promesses s’exécutent d’une manière asynchrone

division(10, 2)
.then((res) => [Link]("résultat : " + res))
.catch((error) => [Link](error))
.finally(() => [Link]('finally'));

H I ©
division(5, 0)
UEL
O
.then((res) => [Link]("résultat : " + res))

LM
.catch((error) => [Link](error))

r e f E
.finally(() => [Link]('finally'));

ch
Le résultat est

résultat : 5
©A
erreur : division par zéro
finally
finally

H & H: Research and Training 44 / 55


Promesse async

[Link]

Le mot-clé async [ES2018]


Il permet de transformer une fonction en promesse

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 45 / 55


Promesse async

[Link]

Le mot-clé async [ES2018]


Il permet de transformer une fonction en promesse

H I ©
UEL
MO
Considérons la fonction somme() suivante
let somme = (a, b) => E
f L
a + b;
c h r e
©A

H & H: Research and Training 45 / 55


Promesse async

[Link]

Le mot-clé async [ES2018]


Il permet de transformer une fonction en promesse

H I ©
UEL
MO
Considérons la fonction somme() suivante
let somme = (a, b) => E
f L
a + b;
c h r e
©A
Le résultat est
[Link](somme(2, 3));
// affiche 5

H & H: Research and Training 45 / 55


Promesse async

[Link]
Pour transformer la fonction somme() en promesse, on ajoute le
mot-clé async à sa déclaration
let somme = async (a, b) => a + b;

H I ©
Maintenant, on peut l’utiliser comme une promesse
UEL
O
// affiche 5 f E LM
somme(2, 3).then(result => [Link](result));

ch r e
©A

H & H: Research and Training 46 / 55


Promesse async

[Link]
Pour transformer la fonction somme() en promesse, on ajoute le
mot-clé async à sa déclaration
let somme = async (a, b) => a + b;

H I ©
Maintenant, on peut l’utiliser comme une promesse
UEL
O
// affiche 5 f E LM
somme(2, 3).then(result => [Link](result));

ch r e
©A
Appeler somme() comme une simple fonction JavaScript
n’affiche pas le résultat
[Link](somme(2, 3));
// affiche Promise { 5 }

H & H: Research and Training 46 / 55


Promesse await

[Link]

Le mot-clé await
H I ©
U EL asynchrones
utilisable seulement dans des environnements
permettant d’interrompre l’exL MOde la fonction asynchrone et
écution
r
attendre la résolutione f
de
E
la promesse
A ch
©

H & H: Research and Training 47 / 55


Promesse await

[Link]

Considérons la promesse somme() qui attend 2 secondes pour retourner un résultat

let somme = (a, b) => {


return new Promise((resolve) => {
setTimeout(() => { resolve(a + b) }, 2000);
});
H I ©
EL
};

O U
f E LM
ch r e
©A

H & H: Research and Training 48 / 55


Promesse await

[Link]

Considérons la promesse somme() qui attend 2 secondes pour retourner un résultat

let somme = (a, b) => {


return new Promise((resolve) => {
setTimeout(() => { resolve(a + b) }, 2000);
});
H I ©
EL
};

O U
f E LM
ch r e
On veut implémenter une promesse sommeCarre() qui utilise la promesse somme()

©A
let sommeCarre = async (a, b) => {
let s = 0;
somme(a, b).then(result => s = result);
let result = [Link](s, 2);
return result;
};

H & H: Research and Training 48 / 55


Promesse await

[Link]

Pour utiliser la promesse avec les valeurs 2 et 3


sommeCarre(2, 3)
.then(result => [Link](result));
H I ©
// affiche 0
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 49 / 55


Promesse await

[Link]

Pour utiliser la promesse avec les valeurs 2 et 3


sommeCarre(2, 3)
.then(result => [Link](result));
H I ©
// affiche 0
UEL
O
f E LM
ch r e
Explication
©A
On n’a pas obtenu le résultat de la somme lorsqu’on a calculé le carré

H & H: Research and Training 49 / 55


Promesse await

Solution, utiliser await pour attendre la fin de la première promesse

let sommeCarre = async (a, b) => {


let s = 0;
await somme(a, b).then(result => s = result);
let result = [Link](s, 2);
return result;
};

H I ©
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 50 / 55


Promesse await

Solution, utiliser await pour attendre la fin de la première promesse

let sommeCarre = async (a, b) => {


let s = 0;
await somme(a, b).then(result => s = result);
let result = [Link](s, 2);
return result;
};

H I ©
Ou
U EL
O
let sommeCarre = async (a, b) => {
let s = somme(a, b);
f E LM
ch
let result = [Link](s, 2); r e
©A
return result;
};

H & H: Research and Training 50 / 55


Promesse await

Solution, utiliser await pour attendre la fin de la première promesse

let sommeCarre = async (a, b) => {


let s = 0;
await somme(a, b).then(result => s = result);
let result = [Link](s, 2);
return result;
};

H I ©
Ou
U EL
O
let sommeCarre = async (a, b) => {
let s = somme(a, b);
f E LM
ch
let result = [Link](s, 2); r e
©A
return result;
};

Si on teste maintenant

sommeCarre(2, 3).then(result => [Link](result));


// affiche 25

H & H: Research and Training 50 / 55


Promesse await

[Link]

H I ©
Remarque
UEL
O
f E LM
await doit toujours être utilisé dans une fonction asynchrone.

ch r e
©A

H & H: Research and Training 51 / 55


Promesse Chaı̂nage de then

[Link]
Considérons la promesse carre() acceptant un seul paramètre

var carre = (a) => {


return new Promise((resolve) => {
resolve(a ** 2);
});
};

H I ©
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 52 / 55


Promesse Chaı̂nage de then

[Link]
Considérons la promesse carre() acceptant un seul paramètre

var carre = (a) => {


return new Promise((resolve) => {
resolve(a ** 2);
});
};

H I ©
U EL
On peut enchaı̂ner les then
O
carre(3)
f E LM
r e
.then((res) => res + 1) // .then((9) => 9 + 1)
.then(carre) // carre (10)
ch
©A
.then((res) => [Link]("résultat : " + res)); // affiche 100

H & H: Research and Training 52 / 55


Promesse Chaı̂nage de then

[Link]
Considérons la promesse carre() acceptant un seul paramètre

var carre = (a) => {


return new Promise((resolve) => {
resolve(a ** 2);
});
};

H I ©
U EL
On peut enchaı̂ner les then
O
carre(3)
f E LM
r e
.then((res) => res + 1) // .then((9) => 9 + 1)
.then(carre) // carre (10)
ch
©A
.then((res) => [Link]("résultat : " + res)); // affiche 100

Remarques

Si une valeur est retournée, la méthode then() suivante est appelée avec cette valeur.

H & H: Research and Training 52 / 55


Promesse [Link]

[Link]

Le mot-clé all retourne une promesse qui

est résolue lorsque l’ensemble des promesses contenues dans

H I ©
l’itérable passé en paramètre ont été résolues

E L qui échoue au
échoue avec la raison de la première promesse
U
sein de l’itérable
L MO
r e f E
A ch
©

H & H: Research and Training 53 / 55


Promesse [Link]

[Link]

Le mot-clé all retourne une promesse qui

est résolue lorsque l’ensemble des promesses contenues dans

H I ©
l’itérable passé en paramètre ont été résolues

E L qui échoue au
échoue avec la raison de la première promesse
U
sein de l’itérable
L MO
r e f E
A ch
©la fonction somme() suivante
Considérons
let somme = async (a, b) => a + b;
let produit = async (a, b) => a * b;

H & H: Research and Training 53 / 55


Promesse [Link]

[Link]

Pour attendre la fin des deux promesses somme et produit pour


faire la suite (afficher les résultats)
H I ©
U EL
Promise
O
.all([somme(2,3), produit(2,3)])
f E LM
ch r e
.then((values) => [Link](values));

©A
// affiche [ 5, 6 ]

H & H: Research and Training 54 / 55


Callbacks vs promesses

[Link]

Callbacks : avantages Promesses : avantages

Simplicité de compréhension (fonction) Lisibilité améliorée

Contrôle précis et facile de l’exécution

H
block catch)I ©
Gestion simplifiée des erreurs (avec un

U EL
MO
Chaı̂nage plus facile.

f E L
ch r e
©A
Callbacks : inconvénients Promesses : inconvénients

Nesting excessif (Callback Hell) : à cause Compatibilité limitée avec certains


des opérations asynchrones imbriquées navigateurs et modules

Gestion d’erreur plus complexe Construction plus complexe

H & H: Research and Training 55 / 55


[Link] : callbacks et modules natifs

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel

[Link]@[Link]

H & H: Research and Training 1 / 73


Plan

1 Types de module

2 Module File System


readFileSync et readFile
writeFileSync et writeFile
appendFileSync et appendFile
renameSync et rename
copyFileSync et copyFile
unlinkSync et unlink
mkdirSync et mkdir
rmdirSync et rmdir
rmSync et rm
existsSync, statSync et stat
readdirSync et readdir

H & H: Research and Training 2 / 73


Plan
3 Module Path
4 Module Readline
5 Module OS
6 Module Colors
7 Objet process
8 Module Http
createServer
listen
request
9 Module Dotenv
10 Module URL
11 nodemon

H & H: Research and Training 3 / 73


Types de module

[Link]

Trois types de modules

Core modules : définis dans le noyau du [Link]. Pour les


utiliser, il faut les importer.
Community modules : proposés par la communauté [Link].
Pour les utiliser, il faut les installer et ensuite les importer.
Modules personnalisés : pour les utiliser, il faut les exporter puis
les importer.

H & H: Research and Training 4 / 73


Types de module

[Link]

Pour importer un Core module


const module = require('nom-module');

H & H: Research and Training 5 / 73


Types de module

[Link]

Pour importer un Core module


const module = require('nom-module');

Pour les distinguer des autres modules, on peut aussi ajouter le


préfixe node
const module = require('node:nom-module');

H & H: Research and Training 5 / 73


Types de module

[Link]

Quelques Core modules


File System
Http
OS
Path
...

H & H: Research and Training 6 / 73


Module File System

[Link]

Module File System (fs)


Module [Link] offrant des fonctions, synchrones et asynchrones
(utilisant les callback) pour gérer les fichiers
Création
Lecture
Écriture
Renommage
Suppression
...

Documentation officielle :
[Link]

H & H: Research and Training 7 / 73


Module File System

[Link]

Pour l’utiliser, il faut l’importer


const fs = require('node:fs');

H & H: Research and Training 8 / 73


Module File System

[Link]

Pour l’utiliser, il faut l’importer


const fs = require('node:fs');

Et pour les promesses


const fs = require('node:fs/promises');

H & H: Research and Training 8 / 73


Module File System

[Link]

Pour la suite, créer les trois fichiers suivants

[Link]

[Link]

[Link]

[Link]

H & H: Research and Training 9 / 73


Module File System

[Link]

Pour la suite, créer les trois fichiers suivants

[Link]

[Link]

[Link]

[Link]

Dans [Link]

bonjour
bonsoir
salut
hello

H & H: Research and Training 9 / 73


Module File System readFileSync et readFile

[Link]
Pour lire le contenu d’un fichier (à ajouter dans [Link])
const fs = require('node:fs');
const content = [Link]('./[Link]');
[Link]([Link]());
[Link]('end of file');

H & H: Research and Training 10 / 73


Module File System readFileSync et readFile

[Link]
Pour lire le contenu d’un fichier (à ajouter dans [Link])
const fs = require('node:fs');
const content = [Link]('./[Link]');
[Link]([Link]());
[Link]('end of file');

Ou en mode asynchrone (à ajouter dans [Link])


const fs = require('node:fs');
[Link]('./[Link]', (err, result) => {
if (err)
return [Link](err);
return [Link]([Link]());
});
[Link]('end of file');

H & H: Research and Training 10 / 73


Module File System readFileSync et readFile

[Link]

Exécuter les deux fichiers séparément

Avez-vous remarqué une différence ?

H & H: Research and Training 11 / 73


Module File System readFileSync et readFile

[Link]

Une écriture utilisant les promesses


const fs = require('node:fs/promises');

[Link]("[Link]")
.then(content => [Link]([Link]()))
.catch(err => [Link]("Problème de lecture"))

[Link]('end of file');

H & H: Research and Training 12 / 73


Module File System writeFileSync et writeFile

[Link]

Pour écrire dans un fichier (à ajouter dans [Link])

const fs = require('node:fs');
[Link]('./[Link]', 'hello');

H & H: Research and Training 13 / 73


Module File System writeFileSync et writeFile

[Link]

Pour écrire dans un fichier (à ajouter dans [Link])

const fs = require('node:fs');
[Link]('./[Link]', 'hello');

Ou en mode asynchrone (à ajouter dans [Link])

const fs = require('node:fs');

[Link]('[Link]', 'bonjour', (err) => {


if (err)
throw err;
[Link]('écriture effectuée avec succès');
});

H & H: Research and Training 13 / 73


Module File System writeFileSync et writeFile

[Link]

Remarques

writeFileSync et writeFile créent le fichier s’il n’existe pas.


Si le fichier existe son contenu précédent sera remplacé par le
nouveau.

H & H: Research and Training 14 / 73


Module File System appendFileSync et appendFile

[Link]

Pour écrire à la suite dans un fichier (à ajouter dans [Link])

const fs = require('node:fs');
[Link]('./[Link]', 'other');

H & H: Research and Training 15 / 73


Module File System appendFileSync et appendFile

[Link]

Pour écrire à la suite dans un fichier (à ajouter dans [Link])

const fs = require('node:fs');
[Link]('./[Link]', 'other');

Ou en mode asynchrone (à ajouter dans [Link])

const fs = require('node:fs');

[Link]('[Link]', 'autre', (err) => {


if (err)
throw err;
[Link]('écriture effectuée avec succès');
});

H & H: Research and Training 15 / 73


Module File System appendFileSync et appendFile

[Link]

Remarques

appendFileSync et appendFile créent le fichier s’il n’existe


pas.
Si le fichier existe, le nouveau contenu sera ajouté à la suite du
précédent.

H & H: Research and Training 16 / 73


Module File System appendFileSync et appendFile

[Link]

Exercice

Écrire un programme [Link] qui permet de copier le contenu du


fichier [Link] dans un nouveau fichier
[Link]
Proposer deux versions : une première en utilisant les fonctions
synchrones et une deuxième en utilisant les fonctions
asynchrones

H & H: Research and Training 17 / 73


Module File System appendFileSync et appendFile

[Link]

Correction

var fs = require("node:fs");

[Link]("[Link]", "utf8", (err, result) => {


if (err) return [Link](err);

[Link]("salutation - [Link]", result, (err) => {


if (err) return [Link](err);
[Link]("C'est fait");
});
});

H & H: Research and Training 18 / 73


Module File System renameSync et rename

[Link]

Pour renommer un fichier (à ajouter dans [Link])

const fs = require('node:fs');
[Link]('./[Link]', '[Link]');

H & H: Research and Training 19 / 73


Module File System renameSync et rename

[Link]

Pour renommer un fichier (à ajouter dans [Link])

const fs = require('node:fs');
[Link]('./[Link]', '[Link]');

Ou en mode asynchrone (à ajouter dans [Link])

const fs = require('node:fs');

[Link]('[Link]', '[Link]', (err) => {


if (err) throw err;
[Link]('Fichier renommé avec succès');
});

H & H: Research and Training 19 / 73


Module File System renameSync et rename

[Link]

Remarques

Si le fichier à renommer n’existe pas, une exception sera levée.


renameSync et rename permettent de renommer les fichiers et
les répertoires.
renameSync et rename permettent également de déplacer les
fichiers et les répertoires.

H & H: Research and Training 20 / 73


Module File System copyFileSync et copyFile

[Link]

Pour copier un fichier (à ajouter dans [Link])

const fs = require('node:fs');
[Link]('[Link]', '[Link]');

H & H: Research and Training 21 / 73


Module File System copyFileSync et copyFile

[Link]

Pour copier un fichier (à ajouter dans [Link])

const fs = require('node:fs');
[Link]('[Link]', '[Link]');

Ou en mode asynchrone (à ajouter dans [Link])

const fs = require('node:fs');

[Link]('[Link]', '[Link]', (err) => {


if (err) throw err;
[Link]('Fichier copié avec succès');
});

H & H: Research and Training 21 / 73


Module File System copyFileSync et copyFile

[Link]

Remarques

Si le fichier à copier n’existe pas, une exception sera levée.


copyFileSync et copyFile copient le fichier sans le supprimer
(elles ne le déplacent pas).

H & H: Research and Training 22 / 73


Module File System unlinkSync et unlink

[Link]

Pour supprimer un fichier (à ajouter dans [Link])

const fs = require('node:fs');
[Link]('[Link]');

H & H: Research and Training 23 / 73


Module File System unlinkSync et unlink

[Link]

Pour supprimer un fichier (à ajouter dans [Link])

const fs = require('node:fs');
[Link]('[Link]');

Ou en mode asynchrone (à ajouter dans [Link])

const fs = require('node:fs');

[Link]('[Link]', (err) => {


if (err) throw err;
[Link]('Fichier supprimé');
});

H & H: Research and Training 23 / 73


Module File System unlinkSync et unlink

[Link]

Remarques

Si le fichier à supprimer n’existe pas, une exception sera levée.


unlinkSync et unlink permettent de supprimer les fichiers
mais pas les répertoires.

H & H: Research and Training 24 / 73


Module File System mkdirSync et mkdir

[Link]

Pour créer un répertoire (à ajouter dans [Link])

const fs = require('node:fs');
[Link]('a');

H & H: Research and Training 25 / 73


Module File System mkdirSync et mkdir

[Link]

Pour créer un répertoire (à ajouter dans [Link])

const fs = require('node:fs');
[Link]('a');

Ou en mode asynchrone (à ajouter dans [Link])

const fs = require('node:fs');

[Link]('b', (err) => {


if (err) throw err;
[Link]('Répertoire créé avec succès');
});

H & H: Research and Training 25 / 73


Module File System mkdirSync et mkdir

[Link]

Pour créer récursivement une arborescence de répertoires (à ajouter dans


[Link])

const fs = require('fs', { recursive: true });


[Link]('a/b/c');

H & H: Research and Training 26 / 73


Module File System mkdirSync et mkdir

[Link]

Pour créer récursivement une arborescence de répertoires (à ajouter dans


[Link])

const fs = require('fs', { recursive: true });


[Link]('a/b/c');

Ou en mode asynchrone (à ajouter dans [Link])

const fs = require('node:fs');

[Link]('x/y/z', { recursive: true }, (err) => {


if (err) throw err;
[Link]('Répertoires créés avec succès');
});

H & H: Research and Training 26 / 73


Module File System rmdirSync et rmdir

[Link]

Pour supprimer le répertoire vide c (à ajouter dans [Link])

const fs = require('node:fs');
[Link]('a/b/c');

H & H: Research and Training 27 / 73


Module File System rmdirSync et rmdir

[Link]

Pour supprimer le répertoire vide c (à ajouter dans [Link])

const fs = require('node:fs');
[Link]('a/b/c');

Ou en mode asynchrone (à ajouter dans [Link])

const fs = require('node:fs');

[Link]('x/y/z', (err) => {


if (err) throw err;
[Link]('Répertoire supprimé avec succès');
});

H & H: Research and Training 27 / 73


Module File System rmdirSync et rmdir

[Link]

rmdirSync et rmdir ne permettent pas de supprimer un dossier non vide

const fs = require('node:fs');
[Link]('a');

H & H: Research and Training 28 / 73


Module File System rmdirSync et rmdir

[Link]

rmdirSync et rmdir ne permettent pas de supprimer un dossier non vide

const fs = require('node:fs');
[Link]('a');

Remarque

L’instruction précédente génère l’erreur suivante :


Error: ENOTEMPTY: directory not empty, rmdir ’a’

H & H: Research and Training 28 / 73


Module File System rmSync et rm

[Link]

Pour supprimer un fichier ou un dossier vide ou non-vide (à ajouter dans [Link])

const fs = require('node:fs');
[Link]('a', { recursive: true, force: true });

H & H: Research and Training 29 / 73


Module File System rmSync et rm

[Link]

Pour supprimer un fichier ou un dossier vide ou non-vide (à ajouter dans [Link])

const fs = require('node:fs');
[Link]('a', { recursive: true, force: true });

Ou en mode asynchrone (à ajouter dans [Link])

const fs = require('node:fs');

[Link]('x', { recursive: true, force: true }, (err, res) => {


if (err) [Link]("Problème de suppression");
if (res) [Link]('Suppression effectué avec succès');
});

H & H: Research and Training 29 / 73


Module File System existsSync, statSync et stat

[Link]
Pour vérifier l’existence d’un répertoire ou d’un fichier (à ajouter dans [Link])

const fs = require('node:fs');

if ([Link]('x/y')) {
[Link]("existe");
} else {
[Link]("n'existe pas");
}

H & H: Research and Training 30 / 73


Module File System existsSync, statSync et stat

[Link]
Pour vérifier l’existence d’un répertoire ou d’un fichier (à ajouter dans [Link])

const fs = require('node:fs');

if ([Link]('x/y')) {
[Link]("existe");
} else {
[Link]("n'existe pas");
}

Ou (à ajouter dans [Link])

try {
[Link]('x/y')
[Link]("existe");
} catch (e) {
[Link]("n'existe pas");
}

H & H: Research and Training 30 / 73


Module File System existsSync, statSync et stat

[Link]
Ou en mode asynchrone (à ajouter dans [Link])

const fs = require('node:fs');

[Link]('x/y', (err, res) => {


if (err) [Link]("chemin inexistant");
if (res) [Link]('Chemin existant');
});

H & H: Research and Training 31 / 73


Module File System existsSync, statSync et stat

[Link]
Ou en mode asynchrone (à ajouter dans [Link])

const fs = require('node:fs');

[Link]('x/y', (err, res) => {


if (err) [Link]("chemin inexistant");
if (res) [Link]('Chemin existant');
});

Remarques

existsSync, statSync et stat vérifie les répertoires et les dossiers.

existsSync retourne un booléen tandis que statSync et stat retournent les


stats du paramètre.

exists est dépréciée.

H & H: Research and Training 31 / 73


Module File System existsSync, statSync et stat

[Link]
Pour tester s’il s’agit d’un fichier ou un répertoire (à ajouter dans [Link])
const fs = require('node:fs');

if (![Link]('x/y')) {
[Link]("n'existe pas");
} else {
[Link]([Link]('x/y').isFile());
[Link]([Link]('x/y').isDirectory());
}

H & H: Research and Training 32 / 73


Module File System existsSync, statSync et stat

[Link]
Pour tester s’il s’agit d’un fichier ou un répertoire (à ajouter dans [Link])
const fs = require('node:fs');

if (![Link]('x/y')) {
[Link]("n'existe pas");
} else {
[Link]([Link]('x/y').isFile());
[Link]([Link]('x/y').isDirectory());
}

Ou en mode asynchrone (à ajouter dans [Link])


const fs = require('node:fs');

[Link]('x/y', (err, res) => {


if (err) [Link]("chemin inexistant");
if (res) {
[Link]([Link]())
[Link]([Link]())
}
});

H & H: Research and Training 32 / 73


Module File System existsSync, statSync et stat

[Link]

fstat est similaire à stat mais elle n’accepte comme paramètre qu’un file descriptor
[Link])

const fs = require('node:fs');

const elt = [Link]('[Link]')


if ([Link](elt)) {
[Link]("existe");
} else {
[Link]("n'existe pas");
}

H & H: Research and Training 33 / 73


Module File System readdirSync et readdir

[Link]
Pour lire le contenu d’un répertoire (à ajouter dans [Link])

const fs = require('node:fs');
const contents = [Link]("./dossier");
for (const content of contents) {
[Link](content);
}

H & H: Research and Training 34 / 73


Module File System readdirSync et readdir

[Link]
Pour lire le contenu d’un répertoire (à ajouter dans [Link])

const fs = require('node:fs');
const contents = [Link]("./dossier");
for (const content of contents) {
[Link](content);
}

Ou en mode asynchrone (à ajouter dans [Link])

const fs = require('node:fs');

[Link]('./dossier', (err, contents) => {


if (err) [Link]("Erreur de lecture");
for (const content of contents) {
[Link](content);
}
});

H & H: Research and Training 34 / 73


Module File System readdirSync et readdir

[Link]

Considérons le tableau suivant


const files = ["[Link]", "[Link]", "[Link]"];

H & H: Research and Training 35 / 73


Module File System readdirSync et readdir

[Link]

Considérons le tableau suivant


const files = ["[Link]", "[Link]", "[Link]"];

Exercice

Écrire un programme [Link] qui permet de créer un répertoire


monDossier et trois fichiers [Link], [Link] et [Link]
(dans monDossier)

Proposer deux versions : une utilisant les fonctions synchrones et une


utilisant les fonctions asynchrones

H & H: Research and Training 35 / 73


Module File System readdirSync et readdir

[Link]

Solution synchrone

const fs = require("fs");
const files = ["[Link]", "[Link]", "[Link]"];

if ([Link]('monDossier')) {
[Link]('dossier existe déjà');
} else {
[Link]('monDossier');
}
for (const file of files) {
[Link]( `monDossier/${file}`, "contenu");
}

H & H: Research and Training 36 / 73


Module File System readdirSync et readdir

[Link]

Solution asynchrone

const fs = require("fs");
const files = ["[Link]", "[Link]", "[Link]"];

[Link]('monDossier', (err) => {


if (!err) [Link]('dossier existe déjà', err)
else {
[Link]('monDossier', (err) => {
if (err) [Link]("problème de création de dossier")
else {
[Link]( `dossier créé `)
for (const file of files) {
[Link]( `monDossier/${file}`, "contenu", (err) => {
if (err) [Link]( `problème de création de fichier ${file}`)
else [Link]( `fichier ${file} créé `)
});
}
}
});
}
});

H & H: Research and Training 37 / 73


Module File System readdirSync et readdir

[Link]

Exercice

Écrire un programme [Link] qui permet de générer un rapport


illustrant le contenu d’un répertoire appelé monDossier : nom du
fichier/dossier + type (fichier ou dossier)
Proposer deux versions : une utilisant les fonctions synchrones et
une utilisant les fonctions asynchrones

H & H: Research and Training 38 / 73


Module File System readdirSync et readdir

[Link]

Solution

let fs = require('fs');
let rapport = "[Link]";
let dossier = 'monDossier';
let arbo = [Link](dossier);

for (const elt of arbo) {


const chemin = `./${dossier}/${elt} `
const fileOrDir = `${[Link](chemin).isDirectory() ? 'dossier' : 'fichier'} `
[Link](rapport, `${elt} : ${fileOrDir} \n`);
}

H & H: Research and Training 39 / 73


Module File System readdirSync et readdir

[Link]

Pour récupérer le nom du fichier courant


[Link](__filename)

H & H: Research and Training 40 / 73


Module File System readdirSync et readdir

[Link]

Pour récupérer le nom du fichier courant


[Link](__filename)

Pour récupérer le nom du répertoire courant


[Link](__dirname)

H & H: Research and Training 40 / 73


Module Path

[Link]

Module Path
Module [Link] offrant des fonctions synchrones pour gérer les
chemins

H & H: Research and Training 41 / 73


Module Path

[Link]

Module Path
Module [Link] offrant des fonctions synchrones pour gérer les
chemins

Pour l’utiliser, il faut l’importer


const path = require('node:path');

H & H: Research and Training 41 / 73


Module Path

[Link]
Pour récupérer le nom du dossier parent
[Link]([Link]('monDossier/[Link]'));
// affiche monDossier

H & H: Research and Training 42 / 73


Module Path

[Link]
Pour récupérer le nom du dossier parent
[Link]([Link]('monDossier/[Link]'));
// affiche monDossier

Pour récupérer la dernière partie d’un chemin


[Link]([Link]('monDossier/[Link]'));
// affiche [Link]

H & H: Research and Training 42 / 73


Module Path

[Link]
Pour récupérer le nom du dossier parent
[Link]([Link]('monDossier/[Link]'));
// affiche monDossier

Pour récupérer la dernière partie d’un chemin


[Link]([Link]('monDossier/[Link]'));
// affiche [Link]

Pour récupérer l’extension d’un fichier


[Link]([Link]('monDossier/[Link]'));
// affiche .txt

H & H: Research and Training 42 / 73


Module Path

[Link]

Pour déterminer si un chemin est absolu


[Link]([Link]('monDossier/[Link]'));
// affiche false

H & H: Research and Training 43 / 73


Module Path

[Link]

Pour déterminer si un chemin est absolu


[Link]([Link]('monDossier/[Link]'));
// affiche false

Pour construire le chemin absolu vers un paramètre


[Link]([Link]('monDossier/[Link]'));
// affiche chemin absolu vers [Link]

H & H: Research and Training 43 / 73


Module Path

[Link]

Pour construire un chemin relatif à partir de plusieurs paramètres


[Link]([Link]( 'public', '[Link]'));
// affiche public\[Link]

H & H: Research and Training 44 / 73


Module Path

[Link]

Pour construire un chemin relatif à partir de plusieurs paramètres


[Link]([Link]( 'public', '[Link]'));
// affiche public\[Link]

Pour construire un chemin absolu à partir de plusieurs paramètres


[Link]([Link]( 'public', '[Link]'));
// affiche C:\Users\Admin\Desktop\cours-node\public\index
.html

H & H: Research and Training 44 / 73


Module Path

[Link]

Pour construire un chemin relatif à partir de plusieurs paramètres


[Link]([Link]( 'public', '[Link]'));
// affiche public\[Link]

Pour construire un chemin absolu à partir de plusieurs paramètres


[Link]([Link]( 'public', '[Link]'));
// affiche C:\Users\Admin\Desktop\cours-node\public\index
.html

Ces méthodes ne permettent pas la construction physique d’un chemin.

H & H: Research and Training 44 / 73


Module Readline

[Link]

Module Readline

Module [Link] fournissant une interface de lecture de données depuis un stream

H & H: Research and Training 45 / 73


Module Readline

[Link]

Module Readline

Module [Link] fournissant une interface de lecture de données depuis un stream

Pour l’utiliser, il faut l’importer

const readline = require("node:readline");

H & H: Research and Training 45 / 73


Module Readline

[Link]

Module Readline

Module [Link] fournissant une interface de lecture de données depuis un stream

Pour l’utiliser, il faut l’importer

const readline = require("node:readline");

Et ensuite construire le scanner

const scanner = [Link]({


input: [Link],
output: [Link]
});

H & H: Research and Training 45 / 73


Module Readline

[Link]

Pour lire une donnée saisie par l’utilisateur et ensuite fermer le scanner
[Link]("Votre nom", function(nom) {
[Link]( `Bonjour ${nom} `);
[Link]();
});

H & H: Research and Training 46 / 73


Module Readline

[Link]

Pour lire une donnée saisie par l’utilisateur et ensuite fermer le scanner
[Link]("Votre nom", function(nom) {
[Link]( `Bonjour ${nom} `);
[Link]();
});

Pour exécuter une fonction à la fermeture de la console


[Link]("close", function() {
[Link]("Fin!");
});

H & H: Research and Training 46 / 73


Module Readline

[Link]

Exercice
En utilisant la version promesse de readline, écrire un script
[Link] qui permet demande à l’utilisateur de saisir son puis son
prénom et qui les affiche dans un message de bienvenue.

H & H: Research and Training 47 / 73


Module OS

[Link]

Module Operating System : os

Module [Link] offrant des fonctions synchrones permettant de


fournir de données sur le système d’exploitation
nombre de CPU
hostname
...

H & H: Research and Training 48 / 73


Module OS

[Link]

Module Operating System : os

Module [Link] offrant des fonctions synchrones permettant de


fournir de données sur le système d’exploitation
nombre de CPU
hostname
...

Pour l’utiliser, il faut l’importer


const os = require('node:os');

H & H: Research and Training 48 / 73


Module OS

[Link]

Exemple
[Link]("Mémoire", [Link]());
[Link]("Nombre CPU", [Link]().length);
[Link]("Hostname", [Link]());
[Link]("Utilisateur", [Link]().username);

H & H: Research and Training 49 / 73


Module Colors

[Link]

Pour utiliser le module colors , il faut l’installer


npm install colors

H & H: Research and Training 50 / 73


Module Colors

[Link]

Pour utiliser le module colors , il faut l’installer


npm install colors

Et ensuite l’importation
require('colors');

H & H: Research and Training 50 / 73


Module Colors

[Link]

Pour modifier la couleur d’affichage


[Link]('Attention!'.red);
[Link]("c'est correct!".[Link]);
[Link]('celui-ci aussi'.[Link]);
[Link]('lettres en couleurs'.rainbow);
[Link]('drapeau américain et français'.america);
[Link]("c'est quoi ce truc".trap);

H & H: Research and Training 51 / 73


Module Colors

[Link]

Pour modifier le style


[Link]('texte souligné'.underline);
[Link]('texte italic'.italic);
[Link]('texte gras'.bold);
[Link]('texte à couleurs inversées'.inverse);

H & H: Research and Training 52 / 73


Objet process

[Link]

Objet process

Objet global [Link] offrant des propriétés et des fonctions sur le


processus

H & H: Research and Training 53 / 73


Objet process

[Link]

Objet process

Objet global [Link] offrant des propriétés et des fonctions sur le


processus

Pour récupérer le PID du processus


[Link]([Link])

H & H: Research and Training 53 / 73


Objet process

[Link]

Objet process

Objet global [Link] offrant des propriétés et des fonctions sur le


processus

Pour récupérer le PID du processus


[Link]([Link])

Pour récupérer la version utilisée de [Link]


[Link]([Link])

H & H: Research and Training 53 / 73


Objet process

[Link]

[Link] : tableau contenant


[Link][0] : la commande (node)
[Link][1] : chemin absolu vers le fichier exécuté
[Link][2] : le premier argument s’il y en a
...

H & H: Research and Training 54 / 73


Objet process

[Link]

[Link] : tableau contenant


[Link][0] : la commande (node)
[Link][1] : chemin absolu vers le fichier exécuté
[Link][2] : le premier argument s’il y en a
...

Pour tester
[Link]([Link][0])
[Link]([Link][1])

H & H: Research and Training 54 / 73


Objet process

[Link]
Qu’affiche le programme suivant ?
[Link]("beforeExit", () => {
[Link]("beforeExit");
});

[Link]("Begin");

setTimeout(() => {
[Link]("the asynchronous timeout");
[Link]("End");
}, 2000);

H & H: Research and Training 55 / 73


Objet process

[Link]
Qu’affiche le programme suivant ?
[Link]("beforeExit", () => {
[Link]("beforeExit");
});

[Link]("Begin");

setTimeout(() => {
[Link]("the asynchronous timeout");
[Link]("End");
}, 2000);

Résultat
Begin
the asynchronous timeout
End
beforeExit

H & H: Research and Training 55 / 73


Objet process

[Link]

Qu’affiche le programme suivant ?

[Link]("beforeExit", () => {
[Link]("Last call before end");
});

[Link]("exit", (code) => {


[Link]("The end of the program :", code);
});

[Link]("Begin");
setTimeout(() => {
[Link]("the asynchronous timeout");
[Link]("End");
}, 2000);

H & H: Research and Training 56 / 73


Objet process

[Link]

Qu’affiche le programme suivant ? pourquoi ?

[Link]('uncaughtException', (err) => {


[Link]('Exception captée: ' + err);
});

const obj = { a: 5, b: 3 };
[Link](obj.c.d);

H & H: Research and Training 57 / 73


Module Http

[Link]

Module http

Module [Link] permettant la création d’un serveur HTTP et donc


recevoir des requêtes et retourner des réponses

H & H: Research and Training 58 / 73


Module Http

[Link]

Module http

Module [Link] permettant la création d’un serveur HTTP et donc


recevoir des requêtes et retourner des réponses

Première étape : importer le package http


const http = require('node:http');

H & H: Research and Training 58 / 73


Module Http createServer

[Link]

Deuxième étape : utiliser le module http pour créer un serveur : la fonction


createServer prend en paramètre une fonction qui sera exécutée à chaque fois qu’on
appelle le serveur

const server = [Link]((request, response) => {


[Link]('Hello World!');
[Link]();
});

H & H: Research and Training 59 / 73


Module Http createServer

[Link]

Deuxième étape : utiliser le module http pour créer un serveur : la fonction


createServer prend en paramètre une fonction qui sera exécutée à chaque fois qu’on
appelle le serveur

const server = [Link]((request, response) => {


[Link]('Hello World!');
[Link]();
});

On peut aussi fusionner write et end

const server = [Link]((request, response) => {


[Link]('Hello World!');
});

H & H: Research and Training 59 / 73


Module Http createServer

[Link]
On peut aussi se contenter d’importer la fonction createServer

const { createServer } = require('http');

const server = createServer((request, response) => {


[Link]('Hello World!');
});

H & H: Research and Training 60 / 73


Module Http createServer

[Link]
On peut aussi se contenter d’importer la fonction createServer

const { createServer } = require('http');

const server = createServer((request, response) => {


[Link]('Hello World!');
});

On peut également indiquer le type de la réponse et le code serveur

const { createServer } = require('http');

const server = createServer((request, response) => {


[Link](200, { 'Content-Type': 'text/plain' });
[Link]('Hello World!');
});

H & H: Research and Training 60 / 73


Module Http listen

[Link]

Troisième étape : lancer le serveur pour écouter les requêtes sur le port 3000

[Link](3000);

H & H: Research and Training 61 / 73


Module Http listen

[Link]

Troisième étape : lancer le serveur pour écouter les requêtes sur le port 3000

[Link](3000);

On peut aussi ajouter une fonction à exécuter pendant que le serveur est à
l’écoute

[Link](3000, () =>
[Link]('Adresse du serveur : [Link]
);

H & H: Research and Training 61 / 73


Module Http listen

[Link]

Code final

const { createServer } = require('http');

const server = createServer((request, response) => {


[Link](200, { 'Content-Type': 'text/plain' });
[Link]('Hello World!');
});

[Link](3000, () =>
[Link]('Adresse du serveur : [Link]
);

H & H: Research and Training 62 / 73


Module Http listen

[Link]

Code final

const { createServer } = require('http');

const server = createServer((request, response) => {


[Link](200, { 'Content-Type': 'text/plain' });
[Link]('Hello World!');
});

[Link](3000, () =>
[Link]('Adresse du serveur : [Link]
);

Pour tester depuis un navigateur, aller à l’URL [Link]

H & H: Research and Training 62 / 73


Module Http request

[Link]
On peut aussi tester en utilisant la méthode request de http (code à placer
dans [Link])
const http = require('http');

const options = {
host: 'localhost',
port: 3000,
path: '',
method: 'GET'
};

http
.request(options, (response) => {
[Link]( `STATUS: ${[Link]} `);
})
.on("error", (err) => {
[Link]("Erreur : ", err)
})
.end();

H & H: Research and Training 63 / 73


Module Http request

[Link]

Pour tester
Ouvrez un terminal et lancez le premier programme
Ouvrez un deuxième terminal et lancez le deuxième programme
et vérifiez l’affichage suivant : STATUS: 200

H & H: Research and Training 64 / 73


Module Dotenv

[Link]

Pour utiliser un fichier de configuration (.env), il faut installer


dotenv
npm install dotenv

H & H: Research and Training 65 / 73


Module Dotenv

[Link]

Pour utiliser un fichier de configuration (.env), il faut installer


dotenv
npm install dotenv

Et ensuite l’importer
require('dotenv').config();

H & H: Research and Training 65 / 73


Module Dotenv

[Link]
À la racine du projet, créons un fichier .env avec le contenu suivant (fichier souvent placé
dans .gitignore)

PORT=5555
NODE_ENV=development

H & H: Research and Training 66 / 73


Module Dotenv

[Link]
À la racine du projet, créons un fichier .env avec le contenu suivant (fichier souvent placé
dans .gitignore)

PORT=5555
NODE_ENV=development

Chargeons dynamiquement le port

const port = [Link] || 3000;


[Link](port, () =>
[Link]( `Adresse du serveur : [Link]
);

H & H: Research and Training 66 / 73


Module Dotenv

[Link]
À la racine du projet, créons un fichier .env avec le contenu suivant (fichier souvent placé
dans .gitignore)

PORT=5555
NODE_ENV=development

Chargeons dynamiquement le port

const port = [Link] || 3000;


[Link](port, () =>
[Link]( `Adresse du serveur : [Link]
);

Pour tester

Relance l’application et vérifiez que Adresse du serveur : [Link]


s’affiche dans la console

H & H: Research and Training 66 / 73


Module URL

[Link]

Module url
Module [Link] permettant de récupérer les différents fragments
d’une URL

H & H: Research and Training 67 / 73


Module URL

[Link]

Module url
Module [Link] permettant de récupérer les différents fragments
d’une URL

Première étape : importer le package http


const url = require('node:url');

H & H: Research and Training 67 / 73


Module URL

[Link]
En supposant que l’URL demandée est : [Link]

const { createServer } = require('node:http');


const url = require('node:url');

const server = createServer((request, response) => {


[Link](200, { 'Content-Type': 'text/plain' });
const requestUrl = [Link]([Link], true);

[Link]([Link]);
// retourne /home?nom=doe&prenom=john

[Link]([Link]);
// retourne /home

[Link]([Link]);
// retourne ?nom=doe&prenom=john

[Link]([Link]);
// retourne un objet : { nom: 'doe', prenom: 'john' }

[Link]('Hello World!');
});

[Link](3000, () => {
[Link]('Adresse du serveur : [Link]

});

H & H: Research and Training 68 / 73


Module URL

[Link]

Pour récupérer les paramètres un par un

const { createServer } = require('node:http');


const url = require('node:url');

const server = createServer((request, response) => {


[Link](200, { 'Content-Type': 'text/plain' });
const requestUrl = [Link]([Link], true);
const { nom, prenom } = [Link]
[Link]( `Bonjour ${nom} ${prenom}`);
[Link]('Hello World!');
});

[Link](3000, () => {
[Link]('Adresse du serveur : [Link]

});

H & H: Research and Training 69 / 73


Module URL

[Link]

Exercice

Écrire un programme qui affiche le résultat d’une opération


arithmétique des nombres passés en paramètre
Si l’adresse saisie dans la barre d’adresse contient
/calcul?op=plus&value1=2&value2=5, la réponse attendue
est 2 + 5 = 7
Les valeurs possibles de op sont plus, moins, fois et div

H & H: Research and Training 70 / 73


Module URL

[Link]

Exercice

Écrire un programme qui génère dans un fichier [Link] la table


de multiplication, addition, soustraction ou division d’un nombre positif
passé en paramètre

H & H: Research and Training 71 / 73


nodemon

[Link]

nodemon
Package [Link]
Il surveille les modifications de fichiers sources
Et il redémarre automatiquement le serveur de l’application
Repository GitHub : [Link]
Documentation :
[Link]

H & H: Research and Training 72 / 73


nodemon

[Link]

Installation
npm install -g nodemon

H & H: Research and Training 73 / 73


nodemon

[Link]

Installation
npm install -g nodemon

Utilisation
nodemon [répertoire ou fichier]

H & H: Research and Training 73 / 73


[Link] : connexion à MongoDB

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en Programmation par contrainte (IA)
Ingénieur en Génie logiciel

[Link]@[Link]

H & H: Research and Training 1 / 72


Plan

1 Introduction

2 Solution avec mongodb


Préparation du projet
Installation de mongodb

3 Utilisation de mongodb
Établissement de connexion
Création d’un objet base de données
Création d’un objet collection

H & H: Research and Training 2 / 72


Plan
4 CRUD avec mongodb
findOne()
find()
find({ ... })
insertOne()
insertMany()
updateOne()
deleteOne()
deleteMany()
5 Solution avec mongoose
Préparation du projet
Installation de mongoose
6 Utilisation de mongodb
Établissement de connexion
Schema et model

H & H: Research and Training 3 / 72


Plan

7 CRUD avec mongoose


save()
create()
insertMany()
findOne()
find()
find({ ... })
findById()
updateOne()
updateMany()
deleteOne()
deleteMany()

H & H: Research and Training 4 / 72


Plan

8 Validation de données avec mongoose


Règles de validation
Autres validateurs
Validation avant l’écriture
Validateur personnalisé
Message personnalisé pour les validateurs par défaut

H & H: Research and Training 5 / 72


Introduction

[Link]

Objectif

Se connecter à une base de données MongoDB depuis une


application [Link]
H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 6 / 72


Introduction

[Link]

Objectif

Se connecter à une base de données MongoDB depuis une


application [Link]
H I ©
UEL
O
f E LM
ch r e
Au moins deux packages NPM disponibles
mongodb ©A
mongoose

H & H: Research and Training 6 / 72


Introduction

[Link]

Package mongodb

Pilote officiel MongoDB pour [Link]


H I ©
EL
API de bas niveau
M OU
f
Permettant d’interagir avecE L base de données MongoDB en
une
e
chrJavaScript
utilisant le langage
Prenant©
A
en charge les callbacks et les promesses

H & H: Research and Training 7 / 72


Introduction

[Link]

Package mongoose

I ©
Bibliothèque open-source créé par Aaron Heckmann
H
EL
Hébergé sur GitHub
M OU
E L qui simplifie l’interaction avec
Offrant une couche d’abstraction
f
MongoDB
c h re
© Aun schéma de données, des fonctions de validation,
Fournissant
des hooks...

H & H: Research and Training 8 / 72


Solution avec mongodb

[Link]

Étapes
H I ©
Création d’un nouveau projet [Link]
UEL
O
Installation du pilote mongodb
f E LM
r e
Importation des modules mongodb installés
ch
Utilisation ©A

H & H: Research and Training 9 / 72


Solution avec mongodb Préparation du projet

[Link]

Démarche

H I ©
Créez un répertoire cours-mongo dans votre espace de travail
U EL
O
cours-mongo
f E LM
Lancez VSC et allez dans File > Open Folder... et choisissez

r e
chcréez un fichier [Link]
A
Dans cours-mongo,
©

H & H: Research and Training 10 / 72


Solution avec mongodb Préparation du projet

[Link]

Initiation d’un projet [Link]

H I ©
EL
npm init -y

O U
f E LM
ch r e
©A

H & H: Research and Training 11 / 72


Solution avec mongodb Préparation du projet

[Link]

Initiation d’un projet [Link]

H I ©
EL
npm init -y

O U
f E LM
Lancement du projet
ch r e
nodemon . ©A

H & H: Research and Training 11 / 72


Solution avec mongodb Installation de mongodb

[Link]

Installation de mongodb

H I ©
EL
npm install mongodb

O U
f E LM
ch r e
©A

H & H: Research and Training 12 / 72


Solution avec mongodb Installation de mongodb

[Link]

Installation de mongodb

H I ©
EL
npm install mongodb

O U
f E LM
r e
Importation du module installé (dans [Link])
ch
©A
const { MongoClient } = require('mongodb');

H & H: Research and Training 12 / 72


Utilisation de mongodb

[Link]

Utilisation
H I ©
EL
Préparation et établissement de la connexion avec la base de
U
données
M O
E L
Exécution des requêtesf NoSQL
ch r e
Clôture de laAconnexion
©

H & H: Research and Training 13 / 72


Utilisation de mongodb Établissement de connexion

[Link]
Commençons par préparer la chaı̂ne de connexion
const uri = "mongodb://[Link]";

H I ©
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 14 / 72


Utilisation de mongodb Établissement de connexion

[Link]
Commençons par préparer la chaı̂ne de connexion
const uri = "mongodb://[Link]";

H I ©
EL
Construisons ensuite un objet client MongoDB
const client = new MongoClient(uri); O U
f E LM
ch r e
©A

H & H: Research and Training 14 / 72


Utilisation de mongodb Établissement de connexion

[Link]
Commençons par préparer la chaı̂ne de connexion
const uri = "mongodb://[Link]";

H I ©
EL
Construisons ensuite un objet client MongoDB
const client = new MongoClient(uri); O U
f E LM
ch r e
©A
Définissons enfin une fonction dans laquelle on établit la
connexion et on exécute les requêtes
async function run() {

H & H: Research and Training 14 / 72


Utilisation de mongodb Établissement de connexion

[Link]

Dans la fonction run, on établit la connexion avec la base de


données et on la ferme après utilisation
async function run() {
H I ©
try {
U EL
await [Link](); O
f E LM
} finally {
ch r e
} ©A
await [Link]();

H & H: Research and Training 15 / 72


Utilisation de mongodb Établissement de connexion

[Link]

Et pour tout tester, il faut exécuter la promesse H I ©


U EL
run()
O
.catch([Link]);
f E LM
ch r e
©A

H & H: Research and Training 16 / 72


Utilisation de mongodb Création d’un objet base de données

[Link]

Créons une instance de la base de données passée en paramètre


async function run() {
try {
H I ©
await [Link]();
U EL
const db = [Link]('cours'); O
f E LM
} finally {
ch r e
} ©A
await [Link]();

H & H: Research and Training 17 / 72


Utilisation de mongodb Création d’un objet collection

[Link]

Récupérons une référence de la collection passée en paramètre, si elle


n’existe pas alors elle sera créée
async function run() {
H I ©
EL
try {
await [Link]();
O U
LM
const db = [Link]('cours');

r e f E
const personnes = [Link]('personnes');

} finally { ch

}
© [Link]();
await

H & H: Research and Training 18 / 72


CRUD avec mongodb findOne()

[Link]

Pour récupérer le premier document de toute la collection


async function run() {
try {
await [Link]();
H I ©
const db = [Link]('cours');
U EL
O
const personnes = [Link]('personnes');

f E LM
const first = await [Link]();
[Link](first);
ch r e
} finally {
©A
await [Link]();
}
}

H & H: Research and Training 19 / 72


CRUD avec mongodb findOne()

[Link]

Pour récupérer le premier document de toute la collection selon un filtre

async function run() {


try {
H I ©
EL
await [Link]();
const db = [Link]('cours');

O
const personnes = [Link]('personnes'); U
[Link](first);
f E LM
const first = await [Link]({ prenom: 'John' });

} finally {
ch r e
}
} ©A
await [Link]();

H & H: Research and Training 20 / 72


CRUD avec mongodb find()

[Link]

Pour récupérer tous les documents de la collection

async function run() {


try {
await [Link]();
const db = [Link]('cours');
H I ©
const personnes = [Link]('personnes');
UEL
MO{
const documents = await [Link]().toArray();

f E L
for (const doc of documents)

ch r e
[Link](doc);
}
© A
} finally {
await [Link]();
}
}

H & H: Research and Training 21 / 72


CRUD avec mongodb find()

[Link]

La méthode find() ne retourne pas un tableau, elle retourne un curseur

async function run() {


try {
await [Link]();
const db = [Link]('cours');
H I ©
const personnes = [Link]('personnes');
UEL
const list = [Link]()
O
f E LM
ch r e
while (await [Link]()) {
[Link](await [Link]());
}
} finally { ©A
await [Link]();
}
}

H & H: Research and Training 22 / 72


CRUD avec mongodb find()

[Link]

Une deuxième version avec for ... of

async function run() {


try {
await [Link]();
const db = [Link]('cours');
H I ©
const personnes = [Link]('personnes');
EL
const list = [Link]()
M OU
for await (const item L
e f E of list) {

chr
[Link](item);
}
© A
} finally {
await [Link]();
}
}

H & H: Research and Training 23 / 72


CRUD avec mongodb find({ ... })

[Link]

Pour récupérer tous les documents respectant certains critères

async function run() {


try {
await [Link]();
H I ©
EL
const db = [Link]('cours');

U
const personnes = [Link]('personnes');

O
const documents = await [Link]({ nom: { $ne: "Wick" } }).toArray();

for (const doc of documents) {


[Link](doc);
f E LM
}

ch r e
©A
} finally {
await [Link]();
}
}

H & H: Research and Training 24 / 72


CRUD avec mongodb insertOne()

[Link]

Pour insérer un nouveau document

async function run() {


try {
H I ©
EL
await [Link]();
const db = [Link]('cours');

O
const personnes = [Link]('personnes'); U
f E LM
const doc = { nom: "Dalton", prenom: "Jack" };
const result = await [Link](doc);

r e
[Link]( `Document inséré avec _id = ${[Link]}`);
} finally {
ch
}
} ©A
await [Link]();

H & H: Research and Training 25 / 72


CRUD avec mongodb insertMany()

[Link]
Pour insérer plusieurs documents

async function run() {


try {
await [Link]();
const db = [Link]('cours');
const personnes = [Link]('personnes');
H I ©
EL
const docs = [
{ nom: 'Hood', prenom: 'Lucas' },
{ nom: 'Carlos', prenom: 'Roberto' },
O U
]
f E LM
{ prenom: 'Peter', nom: 'Schmeikel' }

ch r e
const result = await [Link](docs);

©A
let ids = [Link];
for (const id of [Link](ids)) {
[Link](id);
}
} finally {
await [Link]();
}
}

H & H: Research and Training 26 / 72


CRUD avec mongodb updateOne()

[Link]
Pour modifier un document

async function run() {


try {
await [Link]();
const db = [Link]('cours');
const personnes = [Link]('personnes');

H I ©
const filter = { prenom: "John" };
U EL
const newValues = {
O
LM
$set: {

},
nom: "Travolta",

r e f E
};
ch
©A
const result = await [Link](filter, newValues);
[Link](result);
} finally {
await [Link]();
}
}
run().catch([Link]);

H & H: Research and Training 27 / 72


CRUD avec mongodb deleteOne()

[Link]
Exécution de requête : suppression de données

async function run() {


try {
await [Link]();
const db = [Link]('cours');
const personnes = [Link]('personnes');
H I ©
const filter = {
U EL
O
LM
nom: {

}
$eq: 'Wick',

r e f E
};
ch
©A
const result = await [Link](filter);
[Link](result);
} finally {
await [Link]();
}
}

H & H: Research and Training 28 / 72


CRUD avec mongodb deleteMany()

[Link]
Exécution de requête : suppression de données

async function run() {


try {
await [Link]();
const db = [Link]('cours');
const personnes = [Link]('personnes');
H I ©
const filter = {
U EL
O
LM
nom: {

}
$eq: 'Dalton',

r e f E
};
ch
©A
const result = await [Link](filter);
[Link](result);
} finally {
await [Link]();
}
}

H & H: Research and Training 29 / 72


Solution avec mongoose

[Link]

Étapes
H I ©
Création d’un nouveau projet [Link]
UEL
O
Installation du pilote mongoose
f E LM
r e
Importation des modules mongoose installés
ch
Utilisation ©A

H & H: Research and Training 30 / 72


Solution avec mongoose Préparation du projet

[Link]

Démarche

H I ©
Créez un répertoire cours-mongoose dans votre espace de travail
U EL
O
cours-mongoose
f E LM
Lancez VSC et allez dans File > Open Folder... et choisissez

r e
ch créez un fichier [Link]
A
Dans cours-mongoose,
©

H & H: Research and Training 31 / 72


Solution avec mongoose Préparation du projet

[Link]

Initiation d’un projet [Link]

H I ©
EL
npm init -y

O U
f E LM
ch r e
©A

H & H: Research and Training 32 / 72


Solution avec mongoose Préparation du projet

[Link]

Initiation d’un projet [Link]

H I ©
EL
npm init -y

O U
f E LM
Lancement du projet
ch r e
nodemon . ©A

H & H: Research and Training 32 / 72


Solution avec mongoose Installation de mongoose

[Link]

Installation de mongoose

H I ©
EL
npm install mongoose

O U
f E LM
ch r e
©A

H & H: Research and Training 33 / 72


Solution avec mongoose Installation de mongoose

[Link]

Installation de mongoose

H I ©
EL
npm install mongoose

O U
f E LM
r e
Importation du module installé (dans [Link])
ch
©A
const mongoose = require('mongoose');

H & H: Research and Training 33 / 72


Utilisation de mongodb

[Link]

Utilisation
H I ©
EL
Préparation et établissement de la connexion avec la base de
U
données
M O
E L
Exécution des requêtesf NoSQL
ch r e
Clôture de laAconnexion
©

H & H: Research and Training 34 / 72


Utilisation de mongodb Établissement de connexion

[Link]
Commençons par préparer la chaı̂ne de connexion

const uri = "mongodb://[Link]:27017/cours";

H I ©
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 35 / 72


Utilisation de mongodb Établissement de connexion

[Link]
Commençons par préparer la chaı̂ne de connexion

const uri = "mongodb://[Link]:27017/cours";

Définissons enfin une fonction dans laquelle on établit la connexion et on


H I ©
exécute les requêtes
U EL
O
LM
async function run() {

}
r e f E
ch
©A

H & H: Research and Training 35 / 72


Utilisation de mongodb Établissement de connexion

[Link]
Commençons par préparer la chaı̂ne de connexion

const uri = "mongodb://[Link]:27017/cours";

Définissons enfin une fonction dans laquelle on établit la connexion et on


H I ©
exécute les requêtes
U EL
O
LM
async function run() {

}
r e f E
ch
©A
Établissons la connexion avec la base de données

async function run() {


await [Link](uri);
}

H & H: Research and Training 35 / 72


Utilisation de mongodb Établissement de connexion

[Link]

N’oublions pas d’appeler la fonction run H I ©


U EL
run()
O
.catch([Link]);
f E LM
ch r e
©A

H & H: Research and Training 36 / 72


Utilisation de mongodb Schema et model

[Link]

Préparons le schéma de la collection


async function run() {
H I ©
EL
await [Link](uri);

O U
LM
const personneSchema = new [Link]({
nom: String,
r e f E
ch
prenom: String

©A
});
}

H & H: Research and Training 37 / 72


Utilisation de mongodb Schema et model

[Link]

Quelques autres types


ObjectId
Number
H I ©
U EL
Boolean O
f E LM
Date
ch r e
UUID
©A
Array
...

H & H: Research and Training 38 / 72


Utilisation de mongodb Schema et model

[Link]

Ensuite le modèle

async function run() {


await [Link](uri);
H I ©
U EL
const personneSchema = new [Link]({
O
LM
nom: String,

});
prenom: String

r e f E
ch
} ©A
const Personne = [Link]('Personne', personneSchema);

H & H: Research and Training 39 / 72


Utilisation de mongodb Schema et model

[Link]

On peut aussi fusionner les deux instructions précédentes


async function run() {
H I ©
EL
await [Link](uri);

O U
LM
const Personne = [Link]('Personne', {
nom: String,
r e f E
ch
prenom: String

©A
});
}

H & H: Research and Training 40 / 72


CRUD avec mongoose save()

[Link]

Pour insérer un nouveau document, utilisons la méthode save

async function run() {

await [Link](uri);

H I ©
const Personne = [Link]('Personne', {
UEL
nom: String,
O
LM
prenom: String
});

r e f E
ch
const personne = new Personne({ nom: "Linus", prenom: 'Benjamin' })

©A
[Link]()
.then(res => [Link]( `insertion réussie, id : ${res._id}`))
.catch(err => `Problème d'insertion : ${err}`)
}

H & H: Research and Training 41 / 72


CRUD avec mongoose save()

[Link]

Remarques

À chaque insertion d’un nouveau document, Mongoose ajoute un


champ interne v.
H I ©
UEL
O
Ce champ est utilisé pour le contrôle de la version des
documents.
f E LM
ch r e
À chaque mise à jour, Mongoose incrémente automatiquement la
valeur de v.
©A
Mongoose pourrait l’utiliser pour détecter les conflits de mise à
jour concurrente.

H & H: Research and Training 42 / 72


CRUD avec mongoose save()

Ajoutons un document avec un champ ne figurant pas dans le schéma

async function run() {

await [Link](uri);

const Personne = [Link]('Personne', {


nom: String,
prenom: String
H I ©
EL
});

O U
const personne = new Personne({ nom: "Linus", prenom: 'Benjamin',
age: 57 })

f E LM
[Link]()
ch r e
.then(res => [Link]( `insertion réussie, id : ${res._id}`))

} ©A
.catch(err => `Problème d'insertion : ${err}`)

H & H: Research and Training 43 / 72


CRUD avec mongoose save()

Ajoutons un document avec un champ ne figurant pas dans le schéma

async function run() {

await [Link](uri);

const Personne = [Link]('Personne', {


nom: String,
prenom: String
H I ©
EL
});

O U
const personne = new Personne({ nom: "Linus", prenom: 'Benjamin',
age: 57 })

f E LM
[Link]()
ch r e
.then(res => [Link]( `insertion réussie, id : ${res._id}`))

} ©A
.catch(err => `Problème d'insertion : ${err}`)

Vérifiez que l’age n’a pas été inséré.

H & H: Research and Training 43 / 72


CRUD avec mongoose save()

Pour autoriser l’insertion des champs ne figurant pas dans le schéma, on ajoute la
propriété , { strict: false }

async function run() {

await [Link](uri);

const Personne = [Link]('Personne', {


nom: String,
prenom: String
H I ©
}, { strict: false });
UEL
O
LM
const personne = new Personne({ nom: "Linus", prenom: 'Benjamin',
age: 57 })

r e f E
[Link]()
ch
©A
.then(res => [Link]( `insertion réussie, id : ${res._id}`))
.catch(err => `Problème d'insertion : ${err}`)
}

H & H: Research and Training 44 / 72


CRUD avec mongoose save()

Pour autoriser l’insertion des champs ne figurant pas dans le schéma, on ajoute la
propriété , { strict: false }

async function run() {

await [Link](uri);

const Personne = [Link]('Personne', {


nom: String,
prenom: String
H I ©
}, { strict: false });
UEL
O
LM
const personne = new Personne({ nom: "Linus", prenom: 'Benjamin',
age: 57 })

r e f E
[Link]()
ch
©A
.then(res => [Link]( `insertion réussie, id : ${res._id}`))
.catch(err => `Problème d'insertion : ${err}`)
}

Vérifiez que l’age a été inséré.

H & H: Research and Training 44 / 72


CRUD avec mongoose create()

[Link]

On peut aussi spécifier les valeurs au moment de la création de l’objet

async function run() {

await [Link](uri);
H I ©
const Personne = [Link]('Personne', {
UEL
O
LM
nom: String,

});
prenom: String

r e f E
ch
©A
[Link]({ nom: "Shephard", prenom: 'Jack', age: 45 })
.then(res => [Link]( `insertion réussie, id : ${res._id}`))
.catch(err => `Problème d'insertion : ${err}`)
}

H & H: Research and Training 45 / 72


CRUD avec mongoose insertMany()

[Link]

Pour insérer plusieurs documents

async function run() {

await [Link](uri);

H I ©
EL
const Personne = [Link]('Personne', {
nom: String,
O U
LM
prenom: String
});

r e f E
ch
[Link]([

©A
{ nom: "Ford" },
{ prenom: 'John', nom: 'Lock' }
])
.then(res => [Link]( `insertion réussie, id : ${res}`))
.catch(err => `Problème d'insertion : ${err}`)
}

H & H: Research and Training 46 / 72


CRUD avec mongoose insertMany()

[Link]

Ou avec create

async function run() {

await [Link](uri);

H I ©
EL
const Personne = [Link]('Personne', {
nom: String,
O U
LM
prenom: String
});

r e f E
ch
[Link]([

©A
{ prenom: "James", age: 37 },
{ prenom: 'John', nom: 'Abruzzi' }
])
.then(res => [Link]( `insertion réussie, id : ${res}`))
.catch(err => `Problème d'insertion : ${err}`)
}

H & H: Research and Training 47 / 72


CRUD avec mongoose findOne()

[Link]

Pour récupérer le premier document de toute la collection


async function run() {
await [Link](uri);

H I ©
const Personne = [Link]('Personne', {
U EL
nom: String,
O
prenom: String
f E LM
});
ch r e
©A
const personne = await [Link]();
[Link](personne);

H & H: Research and Training 48 / 72


CRUD avec mongoose findOne()

[Link]

Pour récupérer le premier document de toute la collection selon un filtre

async function run() {


await [Link](uri);
H I ©
const Personne = [Link]('Personne', {
U EL
O
LM
nom: String,
prenom: String
});
r e f E
ch
©A
const personne = await [Link]({ prenom: 'John' });
[Link](personne);
}

H & H: Research and Training 49 / 72


CRUD avec mongoose find()

[Link]

Pour récupérer tous les documents de la collection

async function run() {


await [Link](uri);
const Personne = [Link]('Personne', {
H I ©
nom: String,
UEL
prenom: String
O
});
f E LM
ch r e
const personnes = await [Link]();

©A
for (const item of personnes) {
[Link](item);
}
}

H & H: Research and Training 50 / 72


CRUD avec mongoose find({ ... })

[Link]

Pour récupérer tous les documents de la collection

async function run() {


await [Link](uri);
const Personne = [Link]('Personne', {
H I ©
nom: String,
U EL
prenom: String
O
});
f E LM
ch r e
const personnes = await [Link]({ nom: 'Wick' });

©A
for (const item of personnes) {
[Link](item);
}
}

H & H: Research and Training 51 / 72


CRUD avec mongoose find({ ... })

Pour appliquer un filtre sur les documents, on peut aussi utiliser les constructeurs de Query (where, equals...)

async function run() {


await [Link](uri);
const Personne = [Link]('Personne', {
nom: String,
prenom: String
});

const personnes = [Link]()


.where('nom')
.equals('Carlos')
.exec();
H I ©
personnes
U EL
.then(res => [Link](res))
O
LM
.catch([Link])

E
}

r e f
ch
©A

H & H: Research and Training 52 / 72


CRUD avec mongoose find({ ... })

Pour appliquer un filtre sur les documents, on peut aussi utiliser les constructeurs de Query (where, equals...)

async function run() {


await [Link](uri);
const Personne = [Link]('Personne', {
nom: String,
prenom: String
});

const personnes = [Link]()


.where('nom')
.equals('Carlos')
.exec();
H I ©
personnes
U EL
.then(res => [Link](res))
O
LM
.catch([Link])

E
}

r e f
ch
Explication ©A
where : pour cibler le champ sur lequel la condition doit s’appliquer

equals : pour vérifier l’égalité de valeur avec le champ indiqué dans where

exec : pour créer la promesse

H & H: Research and Training 52 / 72


CRUD avec mongoose find({ ... })

[Link]
Il est possible d’avoir plusieurs where

async function run() {


await [Link](uri);

const Personne = [Link]('Personne', {


nom: String,
prenom: String
H I ©
});
U EL
O
LM
const personnes = [Link]()
.exists('age')
.where('age')
r e f E
.gt(30)
ch
©A
.where('nom')
.ne('Wick')
.exec()

personnes
.then(res => [Link](res))
.catch([Link])
}

H & H: Research and Training 53 / 72


CRUD avec mongoose find({ ... })

[Link]

Explication

Pour comparer les chaı̂nes de caractères : equals et ne

Pour comparer les nombres : gt, lt, gte et lte

H I ©
Pour tester l’inclusion (dans une liste) : in et nin
U EL
O
LM
Pour les opérateurs logiques : or([c1, c2]) et and([c1, c2])

r e f E
Pour la recherche textuelle : regex(/expression/)
ch
©A
Pour trier : sort({ champ: 1 }) (1 pour croissant, -1 pour décroissant)

Pour déselectionner quelques documents : limit() et skip

Pour sélectionner quelques champs (projection) : select

...

H & H: Research and Training 54 / 72


CRUD avec mongoose find({ ... })

[Link]

H I ©
Pour plus de détails sur les Query
U EL
O
[Link]
f E LM
ch r e
©A

H & H: Research and Training 55 / 72


CRUD avec mongoose findById()

[Link]

Remarques
H I ©
EL
Les méthodes de recherche selon l’identifiant s’attend à une
chaı̂ne de caractère d’un ObjectId
M OU
f E
Si l’ id est de type Number,Lil faut le spécifier dans le schéma
Mongoose A ne c
e
hr pas la mixité de type pour id
supporte
©

H & H: Research and Training 56 / 72


CRUD avec mongoose findById()

[Link]

Pour récupérer un document selon la valeur de son identifiant


async function run() {
await [Link](uri);

H I ©
const Personne = [Link]('Personne', {
U EL
nom: String,
O
prenom: String
f E LM
});
ch r e
©A
const personne = await [Link](3);
[Link](personne);

H & H: Research and Training 57 / 72


CRUD avec mongoose updateOne()

[Link]

Pour modifier un document

async function run() {


await [Link](uri);

const Personne = [Link]('Personne', {


H I ©
nom: String,
U EL
prenom: String
O
LM
});

r e f E
const resultat = await [Link](
{ nom: 'Wick' },
ch
); ©A
{ nom: 'Travolta', age: 65 }

[Link](resultat);

H & H: Research and Training 58 / 72


CRUD avec mongoose updateMany()

[Link]

Pour modifier plusieurs documents

async function run() {


await [Link](uri);

const Personne = [Link]('Personne', {


H I ©
nom: String,
U EL
prenom: String
O
LM
});

r e f E
const resultat = await [Link](
{ nom: 'Wick' },
ch
); ©A
{ nom: 'Travolta', age: 65 }

[Link](resultat);

H & H: Research and Training 59 / 72


CRUD avec mongoose deleteOne()

[Link]

Pour supprimer un document

async function run() {


await [Link](uri);
H I ©
const Personne = [Link]('Personne', {
U EL
O
LM
nom: String,
prenom: String
});
r e f E
ch
©A
const resultat = await [Link]({ nom: 'Carlos' });
[Link](resultat);
}

H & H: Research and Training 60 / 72


CRUD avec mongoose deleteMany()

[Link]

Pour supprimer plusieurs documents

async function run() {


await [Link](uri);
H I ©
const Personne = [Link]('Personne', {
U EL
O
LM
nom: String,
prenom: String
});
r e f E
ch
©A
const resultat = await [Link]({ nom: 'Carlos' });
[Link](resultat);
}

H & H: Research and Training 61 / 72


Validation de données avec mongoose

[Link]

Remarques
H I ©
Avant insertion dans la base de données,U E L
il faut valider les
données.
L MO
r e f E
ch
Les règles de validation peuvent être définies dans le schéma

© A

H & H: Research and Training 62 / 72


Validation de données avec mongoose Règles de validation

[Link]

Ici, nous déclarons nom comme étant un champ obligatoire de type chaı̂ne de caractère et
prenom optionnel de type chaı̂ne de caractère aussi

async function run() {


await [Link](uri);

H I ©
const Personne = [Link]('Personne', {
U EL
nom: {
O
LM
type: String,

},
required: true

r e f E
prenom: {
ch
}
©A
type: String,
required: false

});
}

H & H: Research and Training 63 / 72


Validation de données avec mongoose Autres validateurs

[Link]

Autres validateurs selon le type


H I ©
String : required, minlength, maxlength, enum, match
U EL
O
(pour les expressions régulières).
M
f
Number : required, min, L
Emax.
r e
chmin, max.
A
Date : required,
©

H & H: Research and Training 64 / 72


Validation de données avec mongoose Validation avant l’écriture

[Link]
Pour insérer uniquement si les valeurs sont valides, on peut appeler la méthode validate

async function run() {


await [Link](uri);

const Personne = [Link]('Personne', {


nom: {
type: String,
required: true
H I ©
},
prenom: {
U EL
type: String,
O
LM
required: false

});
}

r e f E
ch
const personne = new Personne({ prenom: 'Benjamin' })

©A
[Link]()
.then(() => {
[Link]()
.then((res) => [Link](res))
.catch(err => [Link]( `Problème de validation : ${err} `))
})
.catch(err => [Link]( `Problème d'insertion : ${err}`))
}

H & H: Research and Training 65 / 72


Validation de données avec mongoose Validation avant l’écriture

[Link]
On peut aussi utiliser try ... catch et await pour éviter l’imbrication des promesses

async function run() {


try {
await [Link](uri);

const Personne = [Link]('Personne', {


nom: {
type: String,
H I ©
EL
required: true

U
},
prenom: {
O
LM
type: String,
required: false

});
}

r e f E
ch
©A
const personne = new Personne({ prenom: 'Benjamin' });

await [Link]();
const res = await [Link]();

[Link](res);
} catch (err) {
[Link]( `Problème d'insertion ou de validation : ${err}`);
}
}

H & H: Research and Training 66 / 72


Validation de données avec mongoose Validation avant l’écriture

[Link]
Même exemple avec create

async function run() {


try {
await [Link](uri);

const Personne = [Link]('Personne', {


nom: {
type: String,
H I ©
EL
required: true

U
},
prenom: {
O
LM
type: String,
required: false

});
}

r e f E
ch
©A
const personne = new Personne({ prenom: 'Benjamin' });

await [Link]();
const res = await [Link](personne);

[Link](res);
} catch (err) {
[Link]( `Problème d'insertion ou de validation : ${err}`);
}
}

H & H: Research and Training 67 / 72


Validation de données avec mongoose Validation avant l’écriture

[Link]
Ou

async function run() {


try {
await [Link](uri);

const Personne = [Link]('Personne', {


nom: {
type: String,
H I ©
EL
required: true

U
},
prenom: {
O
LM
type: String,
required: false

});
}

r e f E
ch
©A
const personne = new Personne({ prenom: 'Benjamin' });

await [Link](personne);
const res = await [Link](personne);

[Link](res);
} catch (err) {
[Link]( `Problème d'insertion ou de validation : ${err}`);
}
}

H & H: Research and Training 68 / 72


Validation de données avec mongoose Validation avant l’écriture

[Link]

Remarques

H I ©
EL
Les champs qui ne figurent pas dans le schéma seront insérés si

OU
la propriété { strict: false } est présente.
M
Les champs figurant dansE leL schéma doivent être valides avant
insertion même si lare
h f
propriété { strict: false } est
présente. Ac
©

H & H: Research and Training 69 / 72


Validation de données avec mongoose Validateur personnalisé

[Link]
Pour définir un validateur personnalisé, on utilise la clé validate

const Personne = [Link]('Personne', {


nom: {
type: String,
required: true
},
prenom: {
type: String,
required: false
H I ©
EL
},
email: {
type: String,
O U
LM
validate: {
validator: (value) => /\S+@\S+\.\S+/.test(value),

}
r e f E
message: "Email n'est pas valide"

}
ch
©A
});

H & H: Research and Training 70 / 72


Validation de données avec mongoose Validateur personnalisé

[Link]
Pour définir un validateur personnalisé, on utilise la clé validate

const Personne = [Link]('Personne', {


nom: {
type: String,
required: true
},
prenom: {
type: String,
required: false
H I ©
EL
},
email: {
type: String,
O U
LM
validate: {
validator: (value) => /\S+@\S+\.\S+/.test(value),

}
r e f
message: "Email n'est pas valide"
E
}
ch
©A
});

\S

Un caractère différent d’un whitespace (espace, retour à la ligne, tabulation...)

H & H: Research and Training 70 / 72


Validation de données avec mongoose Message personnalisé pour les validateurs par défaut

[Link]

Pour définir un message d’erreur personnalisé

const Personne = [Link]('Personne', {


nom: {
type: String,
required: [true, 'Ce champ est obligatoire']
H I ©
EL
},
prenom: {
type: String,
O U
},
required: false

f E LM
email: {
type: String,
ch r e
validate: {
©A
validator: (value) => /\S+@\S+\.\S+/.test(value),
message: "Email n'est pas valide"
}
}
});

H & H: Research and Training 71 / 72


Validation de données avec mongoose Message personnalisé pour les validateurs par défaut

[Link]

Pour intégrer la valeur non-valide dans le message d’erreur, on utilise {VALUE}

const Personne = [Link]('Personne', {


nom: {
type: String,
required: [true, 'Ce champ est obligatoire']
H I ©
EL
},
prenom: {
type: String,
O U
},
required: false

f E LM
email: {
type: String,
ch r e
validate: {
©A
validator: (value) => /\S+@\S+\.\S+/.test(value),
message: "{VALUE} n'est pas valide"
}
}
});

H & H: Research and Training 72 / 72


[Link] : REPL

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel

[Link]@[Link]

H & H: Research and Training 1 / 11


Plan

1 Introduction

2 node

3 .editor

4 .exit

5 .help

6 underscore

7 Quelques raccourcis

H & H: Research and Training 2 / 11


Introduction

[Link]

REPL : Read-Eval-Print-Loop

Terminal interactif de [Link] (et JavaScript)

Accessible depuis n’importe quelle console


H I ©
Invite de commandes,
UEL
O
PowerShell
f E LM
...
ch r e
©A

H & H: Research and Training 3 / 11


Introduction

[Link]

REPL : Read-Eval-Print-Loop

Terminal interactif de [Link] (et JavaScript)

Accessible depuis n’importe quelle console


H I ©
Invite de commandes,
UEL
O
PowerShell
f E LM
...
ch r e
©A
Pour lancer PERL

Saisissez node dans n’importe quel terminal puis cliquez sur Entree .

H & H: Research and Training 3 / 11


node

[Link]

Avec REPL
Une instruction commence par >
H I ©
EL
Le résultat de l’instruction est affiché à la ligne sans >>>
U
O
f ELM
ch r e
©A

H & H: Research and Training 4 / 11


node

[Link]

Avec REPL
Une instruction commence par >
H I ©
EL
Le résultat de l’instruction est affiché à la ligne sans >>>
U
O
f E LM
ch r e
A
Afficher Hello world
©
> [Link]("Hello world")
Hello world

H & H: Research and Training 4 / 11


node

[Link]

On peut effectuer des opérations arithmétiques


> 3+2
H I ©
EL
5

O U
f ELM
ch r e
©A

H & H: Research and Training 5 / 11


node

[Link]

On peut effectuer des opérations arithmétiques


> 3+2
H I ©
EL
5

O U
f ELM
Ou un test logique
ch r e
> 3+2>1+7
false
©A

H & H: Research and Training 5 / 11


node

[Link]
Pour déclarer une variable

> var a = 2

H I ©
UEL
O
f ELM
ch r e
©A

H & H: Research and Training 6 / 11


node

[Link]
Pour déclarer une variable

> var a = 2

Ou

H I ©
EL
> x = 2

O U
f ELM
ch r e
©A

H & H: Research and Training 6 / 11


node

[Link]
Pour déclarer une variable

> var a = 2

Ou

H I ©
EL
> x = 2

O U
f ELM
Pour afficher une variable

ch r e
©A
> x
2

H & H: Research and Training 6 / 11


node

[Link]
Pour déclarer une variable

> var a = 2

Ou

H I ©
EL
> x = 2

O U
f ELM
Pour afficher une variable

ch r e
©A
> x
2

Pour utiliser une variable

> x + 3
5

H & H: Research and Training 6 / 11


.editor

[Link]

Pour une structure conditionnelle

> if (x > 0)
... [Link]('positif')

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 7 / 11


.editor

[Link]

Pour une structure conditionnelle

> if (x > 0)
... [Link]('positif')

H I ©
UEL
O
Pour un bloc de code plus long ou plus complexe, on peut démarrer le mode
.editor
f E LM
> .editor
ch r e
©A
// Entering editor mode (Ctrl+D to finish, Ctrl+C to cancel)
if (x> 0)
[Link]('positif')
else
[Link]('négatif')

H & H: Research and Training 7 / 11


.exit

[Link]

H I ©
Pour quitter REPL
UEL
O
LM
> .exit

r e f E
ch
©A

H & H: Research and Training 8 / 11


.help

[Link]

Pour afficher la liste de commandes, on utilise la commande .help

> .help
H I ©
.break
.clear Alias for .break
U EL
Sometimes you get stuck, this gets you out

O
LM
.editor Enter editor mode
.exit
.help
Exit the REPL

e f E
Print this help message
r
.load
ch
Load JS from a file into the REPL session

©A
.save Save all evaluated commands in this REPL session to a file

H & H: Research and Training 9 / 11


underscore

[Link]

Pour récupérer le résultat de l’opération précédente, on utilise


H I ©
> 2+3
U EL
5
O
> _+4
9
f E LM
>
ch r e
©A

H & H: Research and Training 10 / 11


Quelques raccourcis

[Link]

Quelques raccourcis

CTRL + C (une fois) ≡ .break


H I ©
UEL
CTRL + C (deux fois) ≡ .exit
O
CTRL + D (une fois) ≡ .exit f E LM
ch r e
©A
TAB (deux fois) ≡ pour l’auto-complétion

...

H & H: Research and Training 11 / 11

Vous aimerez peut-être aussi