FullNodeCourse
FullNodeCourse
js : introduction
Achref El Mouelhi
[Link]@[Link]
1 Introduction
2 Installation
[Link]
Visual Studio Code
3 npm
Initialisation
Installation
Désinstallation
Mise à jour
Recherche
Consultation
Exécution
Autres commandes
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
[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
[Link]
[Link]
r e
hdonnées
Persistancecde
A
© de fichiers
Manipulation
Sécurité
...
[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.
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]
...
[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é.
...
[Link]
[Link] : avantages
...
[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
...
[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
[Link]
Pour [Link], il faut
aller à [Link]
H I ©
U EL
O
f E LM
ch r e
©A
[Link]
Pour [Link], il faut
aller à [Link]
H I ©
U EL
O
f E LM
ch r e
Pour vérifier la version installée
©A
node --version
[Link]
Pour [Link], il faut
aller à [Link]
H I ©
U EL
O
f E LM
ch r e
Pour vérifier la version installée
©A
node --version
Ou
node -v
[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
[Link]
chr e
© A
[Link]
chr e
© A
VSC : téléchargement
[Link]/download
[Link]
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
[Link]
Démarche
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
[Link]
Démarche
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");
[Link]
Démarche
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");
node [Link]
[Link]
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]
[Link]
[Link]
H I ©
EL
npm --version
O U
f ELM
ch r e
©A
[Link]
H I ©
EL
npm --version
O U
f ELM
Ou
ch r e
npm -v ©A
[Link]
[Link]
[Link]
[Link]
[Link]
[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]
[Link]
[Link]
[Link]
H I ©
UEL
O
f ELM
ch r e
©A
[Link]
H I ©
UEL
O
LM
Ou
[Link]
H I ©
UEL
O
LM
Ou
[Link]
H I ©
UEL
O
f ELM
ch r e
©A
[Link]
H I ©
UEL
O
Ou
f ELM
npm install -P nom-package
ch r e
©A
[Link]
H I ©
UEL
O
Ou
f ELM
npm install -P nom-package
ch r e
©A
Ou tout simplement
npm install nom-package
[Link]
A l’installation d’une première dépendance locale
H I ©
un dossier node modules sera ajouté pour stocker les dépendances
UEL
O
f ELM
ch r e
©A
[Link]
A l’installation d’une première dépendance locale
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
[Link]
H I ©
UEL
O
f ELM
ch r e
©A
[Link]
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
©
[Link]
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]
[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
[Link]
H I ©
Pour installer plusieurs packages
UEL
O
f ELM
npm install nom-package1 nom-package2 nom-package3
ch r e
©A
[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
[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
[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
[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
[Link]
[Link]
[Link]
[Link]
[Link]
A
y : version ch
mineure
©
x : version majeure
[Link]
"dependencies": {
"mongoose": "ˆ4.6.7",
"mysql": "˜2.3.0"
}
H I ©
UEL
O
f ELM
ch r e
©A
[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.
[Link]
H I ©
Lancer la commande suivante
UEL
O
npm install
f ELM
ch r e
©A
[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
[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
[Link]
[Link]
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
[Link]
[Link]
[Link]
[Link]
[Link]
H I ©
UEL
O
f ELM
ch r e
©A
[Link]
H I ©
Et le contenu de public/[Link]
UEL
O
LM
[Link]("Hello from [Link]");
r e f E
ch
©A
[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]
"scripts": {
"start": "node [Link]",
"serve": "node public/[Link]"
}
H I ©
U EL
O
f E LM
ch r e
©A
"scripts": {
"start": "node [Link]",
"serve": "node public/[Link]"
}
H I ©
npm run serve
UEL
O
f E LM
ch r e
©A
"scripts": {
"start": "node [Link]",
"serve": "node public/[Link]"
}
H I ©
npm run serve
UEL
O
f E LM
ch r e
Pour exécuter la commande associée à la section start
"scripts": {
"start": "node [Link]",
"serve": "node public/[Link]"
}
H I ©
npm run serve
UEL
O
f E LM
ch r e
Pour exécuter la commande associée à la section start
npm start
[Link]
H I ©
EL
npm start
O U
f ELM
ch r e
©A
[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
[Link]
[Link]
[Link]
A ch
Deux dépôts GitHub diff érents :
Pour©Mac OS et Linux : [Link]
Pour Windows :
[Link]
[Link]
L MO
Volta : [Link]
r e f E
...
A ch
©
[Link]
f E
Choisir un format, télécharger puisLinstaller
ch r e
© A
[Link]
H I ©
EL
Soit en téléchargeant et exécutant le script Shell du lien suivant :
U
MO
[Link]
la h
Soit en exécutant c
©A
commande wget
[Link]
H I ©
U EL
O
f ELM
ch r e
©A
[Link]
H I ©
U EL
O
LM
Troisième solution avec wget
f E
wget -qO- [Link] | bash
r e
ch
©A
[Link]
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
[Link]
H I ©
EL
nvm --version
O U
f ELM
ch r e
©A
[Link]
H I ©
EL
nvm --version
O U
f ELM
Ou
ch r e
nvm -v ©A
[Link]
H I ©
U EL
O
f ELM
ch r e
©A
[Link]
H I ©
U EL
O
LM
Pour installer la dernière version (lts) de [Link] (sous Mac et Linux)
[Link]
H I ©
U EL
O
LM
Pour installer la dernière version (lts) de [Link] (sous Mac et Linux)
[Link]
H I ©
Pour désinstaller une version spécifique
U EL
O
nvm uninstall 14.7.0
f ELM
ch r e
©A
[Link]
H I ©
U EL
O
f ELM
ch r e
©A
[Link]
H I ©
U EL
Ou
O
nvm ls
f ELM
ch r e
©A
[Link]
H I ©
U EL
Ou
O
nvm ls
f ELM
ch r e
©A
Résultat (exemple)
[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
©
[Link]
[Link]
[Link]
H I ©
EL
nvm use latest
O U
f ELM
ch r e
©A
[Link]
H I ©
EL
nvm use latest
O U
f ELM
Ou
ch r e
nvm use lts ©A
[Link]
[Link]
H I ©
UEL
O
f ELM
ch r e
©A
[Link]
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
[Link]
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
[Link]
[Link]
[Link]
H I ©
UEL
O
f ELM
ch r e
©A
[Link]
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
[Link]
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
[Link]
Question
Peut-on utiliser npx avec tous les packages [Link] ?
H I ©
UEL
O
f ELM
ch r e
©A
[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.
Achref El Mouelhi
[Link]@[Link]
1 CommonJS
exports
require
Importation multiple
Module ES6 ou ESModule
2 ESModule
export
import
as
default
3 ESModule et CommonJS
4 Callback
5 Promesse
finally
async
await
Chaı̂nage de then
[Link]
6 Callbacks vs promesses
[Link]
Trois types de modules
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
[Link]
Trois types de modules
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
[Link]
Module
Un fichier pouvant contenir des variables, constantes, fonctions,
classes...
H I ©
UEL
O
f E LM
ch r e
©A
[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
[Link]
[Link]
} © A
[Link] = { somme, produit }
[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;
}
[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;
[Link]
Pour importer et utiliser une fonction
[Link](somme(2, 5));
// affiche 7
H I ©
UEL
O
f E LM
ch r e
©A
[Link]
Pour importer et utiliser une fonction
[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
[Link]
[Link]
On peut aussi renommer les éléments exportés
chr e
© A
[Link]
On peut aussi renommer les éléments exportés
chr e
© A
Pour importer
[Link](addition(2, 5));
// affiche 7
[Link]
Utilisons la syntaxe ES6 dans [Link]
[Link]
Utilisons la syntaxe ES6 dans [Link]
[Link](somme(2, 5));
// affiche 7
[Link](produit(2, 5));
// affiche 10
[Link]
exports, require...
H I ©
UEL
O
f E LM
ch r e
©A
[Link]
exports, require...
H I ©
UEL
O
LM
Question
e f E
Peut-on utiliser la syntaxe ES6 (import, export...) avec [Link] ?
r
ch
©A
[Link]
exports, require...
H I ©
UEL
O
LM
Question
e f E
Peut-on utiliser la syntaxe ES6 (import, export...) avec [Link] ?
r
ch
©A
Réponse
[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
[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"
}
[Link]
[Link]
Pour exporter les deux fonctions somme et produit de [Link]
[Link]
Pour exporter les deux fonctions somme et produit de [Link]
ch r e
©A
function somme(a, b) {
return a + b;
}
function produit(a, b) {
return a * b;
}
export { somme, produit };
[Link]
Pour importer et utiliser une fonction
[Link](somme(2, 5));
// affiche 7
H I ©
UEL
O
f E LM
ch r e
©A
[Link]
Pour importer et utiliser une fonction
[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
[Link]
On peut aussi utiliser des alias
[Link](s(2, 5));
// affiche 7
H I ©
EL
[Link](p(2, 5));
// affiche 10
O U
f E LM
ch r e
©A
[Link]
On peut aussi utiliser des alias
[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
[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
[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
[Link]
On peut aussi utiliser le export default (un seul par fichier)
[Link]
On peut aussi utiliser le export default (un seul par fichier)
[Link](somme(2, 5));
// affiche 7
[Link](produit(2, 5));
// affiche 10
[Link]
[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
[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.
[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
[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]
Fonction de retour (callback)
[Link]
Fonction de retour (callback)
[Link]
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
[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
[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
[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
[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
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
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
[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.
[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
[Link]
Solution (avec callback)
©A
searchElement(data, (err, result) => {
if (err) {
[Link]("erreur :" + err);
} else {
[Link]( `${element} est dans le tableau à la position ${
result}`);
}
});
[Link]
Ou
©A
searchElement(tab, element, (err, result) => {
if (err) {
[Link]("erreur :" + err);
} else {
[Link]( `${element} est dans le tableau à la position ${
result}`);
}
});
[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.
[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 I ©
UEL
O
f E LM
ch r e
©A
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 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
[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
[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"));
[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
[Link]
Exemple : déclaration
O U
f E LM
ch r e
©A
[Link]
Exemple : déclaration
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
[Link]
Remarque : les promesses s’exécutent d’une manière asynchrone
};
});
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");
[Link]
Remarque : les promesses s’exécutent d’une manière asynchrone
};
});
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
[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
[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
[Link]
H I ©
UEL
O
f E LM
ch r e
©A
[Link]
H I ©
UEL
MO
Considérons la fonction somme() suivante
let somme = (a, b) => E
f L
a + b;
c h r e
©A
[Link]
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
[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
[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 }
[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
©
[Link]
O U
f E LM
ch r e
©A
[Link]
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;
};
[Link]
[Link]
H I ©
U EL
O
f E LM
ch r e
©A
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 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
[Link]
H I ©
Remarque
UEL
O
f E LM
await doit toujours être utilisé dans une fonction asynchrone.
ch r e
©A
[Link]
Considérons la promesse carre() acceptant un seul paramètre
H I ©
U EL
O
f E LM
ch r e
©A
[Link]
Considérons la promesse carre() acceptant un seul paramètre
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
[Link]
Considérons la promesse carre() acceptant un seul paramètre
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.
[Link]
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
©
[Link]
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;
[Link]
©A
// affiche [ 5, 6 ]
[Link]
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
Achref El Mouelhi
[Link]@[Link]
1 Types de module
[Link]
[Link]
[Link]
[Link]
[Link]
Documentation officielle :
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
Dans [Link]
bonjour
bonsoir
salut
hello
[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');
[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');
[Link]
[Link]
[Link]("[Link]")
.then(content => [Link]([Link]()))
.catch(err => [Link]("Problème de lecture"))
[Link]('end of file');
[Link]
const fs = require('node:fs');
[Link]('./[Link]', 'hello');
[Link]
const fs = require('node:fs');
[Link]('./[Link]', 'hello');
const fs = require('node:fs');
[Link]
Remarques
[Link]
const fs = require('node:fs');
[Link]('./[Link]', 'other');
[Link]
const fs = require('node:fs');
[Link]('./[Link]', 'other');
const fs = require('node:fs');
[Link]
Remarques
[Link]
Exercice
[Link]
Correction
var fs = require("node:fs");
[Link]
const fs = require('node:fs');
[Link]('./[Link]', '[Link]');
[Link]
const fs = require('node:fs');
[Link]('./[Link]', '[Link]');
const fs = require('node:fs');
[Link]
Remarques
[Link]
const fs = require('node:fs');
[Link]('[Link]', '[Link]');
[Link]
const fs = require('node:fs');
[Link]('[Link]', '[Link]');
const fs = require('node:fs');
[Link]
Remarques
[Link]
const fs = require('node:fs');
[Link]('[Link]');
[Link]
const fs = require('node:fs');
[Link]('[Link]');
const fs = require('node:fs');
[Link]
Remarques
[Link]
const fs = require('node:fs');
[Link]('a');
[Link]
const fs = require('node:fs');
[Link]('a');
const fs = require('node:fs');
[Link]
[Link]
const fs = require('node:fs');
[Link]
const fs = require('node:fs');
[Link]('a/b/c');
[Link]
const fs = require('node:fs');
[Link]('a/b/c');
const fs = require('node:fs');
[Link]
const fs = require('node:fs');
[Link]('a');
[Link]
const fs = require('node:fs');
[Link]('a');
Remarque
[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 });
[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 });
const fs = require('node:fs');
[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");
}
[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");
}
try {
[Link]('x/y')
[Link]("existe");
} catch (e) {
[Link]("n'existe pas");
}
[Link]
Ou en mode asynchrone (à ajouter dans [Link])
const fs = require('node:fs');
[Link]
Ou en mode asynchrone (à ajouter dans [Link])
const fs = require('node:fs');
Remarques
[Link]
Pour tester s’il s’agit d’un fichier ou un répertoire (à ajouter dans [Link])
const fs = require('node:fs');
if () {
[Link]("n'existe pas");
} else {
[Link]([Link]('x/y').isFile());
[Link]([Link]('x/y').isDirectory());
}
[Link]
Pour tester s’il s’agit d’un fichier ou un répertoire (à ajouter dans [Link])
const fs = require('node:fs');
if () {
[Link]("n'existe pas");
} else {
[Link]([Link]('x/y').isFile());
[Link]([Link]('x/y').isDirectory());
}
[Link]
fstat est similaire à stat mais elle n’accepte comme paramètre qu’un file descriptor
[Link])
const fs = require('node:fs');
[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);
}
[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);
}
const fs = require('node:fs');
[Link]
[Link]
Exercice
[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");
}
[Link]
Solution asynchrone
const fs = require("fs");
const files = ["[Link]", "[Link]", "[Link]"];
[Link]
Exercice
[Link]
Solution
let fs = require('fs');
let rapport = "[Link]";
let dossier = 'monDossier';
let arbo = [Link](dossier);
[Link]
[Link]
[Link]
Module Path
Module [Link] offrant des fonctions synchrones pour gérer les
chemins
[Link]
Module Path
Module [Link] offrant des fonctions synchrones pour gérer les
chemins
[Link]
Pour récupérer le nom du dossier parent
[Link]([Link]('monDossier/[Link]'));
// affiche monDossier
[Link]
Pour récupérer le nom du dossier parent
[Link]([Link]('monDossier/[Link]'));
// affiche monDossier
[Link]
Pour récupérer le nom du dossier parent
[Link]([Link]('monDossier/[Link]'));
// affiche monDossier
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
Module Readline
[Link]
Module Readline
[Link]
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]();
});
[Link]
Pour lire une donnée saisie par l’utilisateur et ensuite fermer le scanner
[Link]("Votre nom", function(nom) {
[Link]( `Bonjour ${nom} `);
[Link]();
});
[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.
[Link]
[Link]
[Link]
Exemple
[Link]("Mémoire", [Link]());
[Link]("Nombre CPU", [Link]().length);
[Link]("Hostname", [Link]());
[Link]("Utilisateur", [Link]().username);
[Link]
[Link]
Et ensuite l’importation
require('colors');
[Link]
[Link]
[Link]
Objet process
[Link]
Objet process
[Link]
Objet process
[Link]
[Link]
Pour tester
[Link]([Link][0])
[Link]([Link][1])
[Link]
Qu’affiche le programme suivant ?
[Link]("beforeExit", () => {
[Link]("beforeExit");
});
[Link]("Begin");
setTimeout(() => {
[Link]("the asynchronous timeout");
[Link]("End");
}, 2000);
[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
[Link]
[Link]("beforeExit", () => {
[Link]("Last call before end");
});
[Link]("Begin");
setTimeout(() => {
[Link]("the asynchronous timeout");
[Link]("End");
}, 2000);
[Link]
const obj = { a: 5, b: 3 };
[Link](obj.c.d);
[Link]
Module http
[Link]
Module http
[Link]
[Link]
[Link]
On peut aussi se contenter d’importer la fonction createServer
[Link]
On peut aussi se contenter d’importer la fonction createServer
[Link]
Troisième étape : lancer le serveur pour écouter les requêtes sur le port 3000
[Link](3000);
[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]
);
[Link]
Code final
[Link](3000, () =>
[Link]('Adresse du serveur : [Link]
);
[Link]
Code final
[Link](3000, () =>
[Link]('Adresse du serveur : [Link]
);
[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();
[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
[Link]
[Link]
Et ensuite l’importer
require('dotenv').config();
[Link]
À la racine du projet, créons un fichier .env avec le contenu suivant (fichier souvent placé
dans .gitignore)
PORT=5555
NODE_ENV=development
[Link]
À la racine du projet, créons un fichier .env avec le contenu suivant (fichier souvent placé
dans .gitignore)
PORT=5555
NODE_ENV=development
[Link]
À la racine du projet, créons un fichier .env avec le contenu suivant (fichier souvent placé
dans .gitignore)
PORT=5555
NODE_ENV=development
Pour tester
[Link]
Module url
Module [Link] permettant de récupérer les différents fragments
d’une URL
[Link]
Module url
Module [Link] permettant de récupérer les différents fragments
d’une URL
[Link]
En supposant que l’URL demandée est : [Link]
[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]
});
[Link]
[Link](3000, () => {
[Link]('Adresse du serveur : [Link]
});
[Link]
Exercice
[Link]
Exercice
[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]
[Link]
Installation
npm install -g nodemon
[Link]
Installation
npm install -g nodemon
Utilisation
nodemon [répertoire ou fichier]
Achref El Mouelhi
[Link]@[Link]
1 Introduction
3 Utilisation de mongodb
Établissement de connexion
Création d’un objet base de données
Création d’un objet collection
[Link]
Objectif
[Link]
Objectif
[Link]
Package mongodb
[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...
[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
[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,
©
[Link]
H I ©
EL
npm init -y
O U
f E LM
ch r e
©A
[Link]
H I ©
EL
npm init -y
O U
f E LM
Lancement du projet
ch r e
nodemon . ©A
[Link]
Installation de mongodb
H I ©
EL
npm install mongodb
O U
f E LM
ch r e
©A
[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');
[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
©
[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
[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
[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() {
[Link]
[Link]
[Link]
[Link]
r e f E
const personnes = [Link]('personnes');
} finally { ch
}
© [Link]();
await
[Link]
f E LM
const first = await [Link]();
[Link](first);
ch r e
} finally {
©A
await [Link]();
}
}
[Link]
O
const personnes = [Link]('personnes'); U
[Link](first);
f E LM
const first = await [Link]({ prenom: 'John' });
} finally {
ch r e
}
} ©A
await [Link]();
[Link]
f E L
for (const doc of documents)
ch r e
[Link](doc);
}
© A
} finally {
await [Link]();
}
}
[Link]
[Link]
chr
[Link](item);
}
© A
} finally {
await [Link]();
}
}
[Link]
U
const personnes = [Link]('personnes');
O
const documents = await [Link]({ nom: { $ne: "Wick" } }).toArray();
ch r e
©A
} finally {
await [Link]();
}
}
[Link]
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]();
[Link]
Pour insérer plusieurs documents
ch r e
const result = await [Link](docs);
©A
let ids = [Link];
for (const id of [Link](ids)) {
[Link](id);
}
} finally {
await [Link]();
}
}
[Link]
Pour modifier un document
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]);
[Link]
Exécution de requête : suppression de données
}
$eq: 'Wick',
r e f E
};
ch
©A
const result = await [Link](filter);
[Link](result);
} finally {
await [Link]();
}
}
[Link]
Exécution de requête : suppression de données
}
$eq: 'Dalton',
r e f E
};
ch
©A
const result = await [Link](filter);
[Link](result);
} finally {
await [Link]();
}
}
[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
[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,
©
[Link]
H I ©
EL
npm init -y
O U
f E LM
ch r e
©A
[Link]
H I ©
EL
npm init -y
O U
f E LM
Lancement du projet
ch r e
nodemon . ©A
[Link]
Installation de mongoose
H I ©
EL
npm install mongoose
O U
f E LM
ch r e
©A
[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');
[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
©
[Link]
Commençons par préparer la chaı̂ne de connexion
H I ©
U EL
O
f E LM
ch r e
©A
[Link]
Commençons par préparer la chaı̂ne de connexion
}
r e f E
ch
©A
[Link]
Commençons par préparer la chaı̂ne de connexion
}
r e f E
ch
©A
Établissons la connexion avec la base de données
[Link]
[Link]
O U
LM
const personneSchema = new [Link]({
nom: String,
r e f E
ch
prenom: String
©A
});
}
[Link]
[Link]
Ensuite le modèle
});
prenom: String
r e f E
ch
} ©A
const Personne = [Link]('Personne', personneSchema);
[Link]
O U
LM
const Personne = [Link]('Personne', {
nom: String,
r e f E
ch
prenom: String
©A
});
}
[Link]
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}`)
}
[Link]
Remarques
await [Link](uri);
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}`)
await [Link](uri);
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}`)
Pour autoriser l’insertion des champs ne figurant pas dans le schéma, on ajoute la
propriété , { strict: false }
await [Link](uri);
r e f E
[Link]()
ch
©A
.then(res => [Link]( `insertion réussie, id : ${res._id}`))
.catch(err => `Problème d'insertion : ${err}`)
}
Pour autoriser l’insertion des champs ne figurant pas dans le schéma, on ajoute la
propriété , { strict: false }
await [Link](uri);
r e f E
[Link]()
ch
©A
.then(res => [Link]( `insertion réussie, id : ${res._id}`))
.catch(err => `Problème d'insertion : ${err}`)
}
[Link]
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}`)
}
[Link]
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}`)
}
[Link]
Ou avec create
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}`)
}
[Link]
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);
[Link]
[Link]
©A
for (const item of personnes) {
[Link](item);
}
}
[Link]
©A
for (const item of personnes) {
[Link](item);
}
}
Pour appliquer un filtre sur les documents, on peut aussi utiliser les constructeurs de Query (where, equals...)
E
}
r e f
ch
©A
Pour appliquer un filtre sur les documents, on peut aussi utiliser les constructeurs de Query (where, equals...)
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
[Link]
Il est possible d’avoir plusieurs where
personnes
.then(res => [Link](res))
.catch([Link])
}
[Link]
Explication
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)
...
[Link]
H I ©
Pour plus de détails sur les Query
U EL
O
[Link]
f E LM
ch r e
©A
[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
©
[Link]
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);
[Link]
r e f E
const resultat = await [Link](
{ nom: 'Wick' },
ch
); ©A
{ nom: 'Travolta', age: 65 }
[Link](resultat);
[Link]
r e f E
const resultat = await [Link](
{ nom: 'Wick' },
ch
); ©A
{ nom: 'Travolta', age: 65 }
[Link](resultat);
[Link]
[Link]
[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
[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
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
});
}
[Link]
[Link]
Pour insérer uniquement si les valeurs sont valides, on peut appeler la méthode validate
});
}
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}`))
}
[Link]
On peut aussi utiliser try ... catch et await pour éviter l’imbrication des promesses
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}`);
}
}
[Link]
Même exemple avec create
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}`);
}
}
[Link]
Ou
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}`);
}
}
[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
©
[Link]
Pour définir un validateur personnalisé, on utilise la clé validate
}
r e f E
message: "Email n'est pas valide"
}
ch
©A
});
[Link]
Pour définir un validateur personnalisé, on utilise la clé validate
}
r e f
message: "Email n'est pas valide"
E
}
ch
©A
});
\S
[Link]
f E LM
email: {
type: String,
ch r e
validate: {
©A
validator: (value) => /\S+@\S+\.\S+/.test(value),
message: "Email n'est pas valide"
}
}
});
[Link]
f E LM
email: {
type: String,
ch r e
validate: {
©A
validator: (value) => /\S+@\S+\.\S+/.test(value),
message: "{VALUE} n'est pas valide"
}
}
});
Achref El Mouelhi
[Link]@[Link]
1 Introduction
2 node
3 .editor
4 .exit
5 .help
6 underscore
7 Quelques raccourcis
[Link]
REPL : Read-Eval-Print-Loop
[Link]
REPL : Read-Eval-Print-Loop
Saisissez node dans n’importe quel terminal puis cliquez sur Entree .
[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
[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
[Link]
O U
f ELM
ch r e
©A
[Link]
O U
f ELM
Ou un test logique
ch r e
> 3+2>1+7
false
©A
[Link]
Pour déclarer une variable
> var a = 2
H I ©
UEL
O
f ELM
ch r e
©A
[Link]
Pour déclarer une variable
> var a = 2
Ou
H I ©
EL
> x = 2
O U
f ELM
ch r e
©A
[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
[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
> x + 3
5
[Link]
> if (x > 0)
... [Link]('positif')
H I ©
UEL
O
f E LM
ch r e
©A
[Link]
> 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')
[Link]
H I ©
Pour quitter REPL
UEL
O
LM
> .exit
r e f E
ch
©A
[Link]
> .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
[Link]
[Link]
Quelques raccourcis
...