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

Chapitre2 Node - Js

Transféré par

wajihbenhassen.123456
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)
103 vues31 pages

Chapitre2 Node - Js

Transféré par

wajihbenhassen.123456
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

NodeJS

Présentation
Architecture
The reactor patterns
Modules

1
NodeJS

u "Node.js is an open source, cross-platform runtime environment for


building server side and networking applications using JavaScript”
u Built on Chrome's V8 JavaScript engine
u Provides an event-driven, non-blocking I/O API
u The brainchild of Ryan Dahl
u The project was demonstrated at the inaugural European JSConf on
November 8, 2009.

2
Architecture

3
The reactor pattern

u Représente le cœur de la nature asynchrone de Node.js


u se base sur
u architecture single-threaded
u non blocking I/O

4
ci&0i!"#&+&1")6i1%"i0),4"01i*,+$i1%"i#2+!*"+1)i,-"/1&,+0i,#ii ,*-21"/Ni "00&+$
1%"ii&0i&+i1%"i,/!"/i,#i++,0" ,+!0iU;:fCi0" ,+!0VOi4%&)"i "00&+$i!1i,+i1%"i!&0(i,/
1%"i+"14,/(i&0i&+i1%"i,/!"/i,#i*&))&0" ,+!0iU;:f=i0" ,+!0VNi,/i1%"i+!4&!1%Oi&1i&0i1%"
0*"i01,/6Qii%0ii1/+0#"/i/1"i ,+0&01"+1)6i&+i1%"i,/!"/i,#i c0Oi4%&)"i!&0(i+!
I/O +"14,/(i3/&"0i#/,*ic0i1,Oi,-1&*&01& ))6Oi c0Ni ci&0i202))6i+,1i"5-"+0&3"i&+i1"/*0i,#
Oi21i&1i!!0ii!")6i"14""+i1%"i*,*"+1i1%"i/".2"01i&0i0"+1i+!i1%"i*,*"+1i1%"
,-"/1&,+i ,*-)"1"0Ni+i1,-i,#i1%1Oi4"i)0,i%3"i1,i ,+0&!"/i1%"i%2*+i# 1,/Qi,#1"+Oi1%"
&+-21i,#i+i--)& 1&,+i ,*"0i#/,*ii/")i-"/0,+Oi#,/i"5*-)"Oi1%"i )& (i,#ii211,+i,/i
*"00$"i0"+1i&+ii/")f1&*"i %1i--)& 1&,+Oi0,i1%"i0-""!i+!i#/".2"+ 6i,#i ci!,"0+]1i,+)6
u I/O est la plus lente
!"-"+!i,+i1" opération
%+& dans un ordinateur
)i0-" 10i+!i&1i +i"i*+6i,/!"/0i,#i*$+&12!"i0),4"/i1%+i1%"i!&0(i,/
+"14,/(N
u RAM: 10E-9 seconds; GB/s

u disque: 10E-3 seconds; MB/s


u
%ORFNLQJ,2
I/O n’est pas couteux en terme de processeur mais elle rajoute un délai entre
les opération
+i1/!&1&,+)i), (&+$i ci-/,$/**&+$Oi1%"i#2+ 1&,+i ))i ,//"0-,+!&+$i1,i+i ci/".2"01
u Input4&))i),
peut venir d’un être
(i1%"i"5" humain
21&,+i,#i1%"i1%/"!i2+1&)i1%"i,-"/1&,+i ,*-)"1"0Ni%&0i +i$,i#/,*ii#"4
u *&))&0"
I/O est ,+!0Oi&+i1%"i
bloquant dans les 0"i,#i!&0(i "00Oi1,i*&+21"0i,/i"3"+i*,/"Oi&+i 0"i1%"i!1i&0
langages traditionnels:
$"+"/1"!i#/,*i20"/i 1&,+0Oi02 %i0i-/"00&+$ii("6Ni%"i#,)),4&+$i-0"2!, ,!"i0%,40i
u un appel à une opération I/O bloque l’éxécution jusqu’à la fin de l’opération
16-& )i), (&+$i1%/"!i-"/#,/*"!i$&+01ii0, ("1P
//blocks the thread until the data is available
data = socket.read();
//data is available
print(data); 5
1("+i#/,*ii-,,)Vi#,/i" %i ,+ 2//"+1i ,++" 1&,+i1%1i+""!0i1,i"i%+!)"!Ni%&0i46Oi4%"+
i1%/"!i$"10i), ("!i#,/i+i ci,-"/1&,+i&1i4&))i+,1i&*- 1i1%"i3&)&)&16i,#i1%"i,1%"/
/".2"010Oi" 20"i1%"6i/"i%+!)"!i&+i0"-/1"i1%/"!0N
blocking I/O
%"i#,)),4&+$i&*$"i&))201/1"0i1%&0i0 "+/&,P

%"i-/" "!&+$i&*$"i)60i"*-%0&0i,+i1%"i*,2+1i,#i1&*"i" %i1%/"!i&0i&!)"Oi4&1&+$i#,/


%"i*,01i0& i-11"/+i#,/i "00&+$i1%&0i(&+!i,#i+,+f), (&+$i ci&0i1,i 1&3")6i-,))i1%"
/"0,2/ "i4&1%&+ii),,-i2+1&)i0,*"i 12)i!1i&0i/"12/+"!Qi1%&0i&0i ))"!i206`4&1&+$Ni%"
Non-blocking I/O: busy-waiting
#,)),4&+$i-0"2!, ,!"i0%,40i6,2i%,4i&1]0i-,00&)"i1,i/"!i#/,*i*2)1&-)"i/"0,2/ "0i20&+$
+,+f), (&+$i ci+!ii-,))&+$i),,-P
resources = [socketA, socketB, pipeA];
while(!resources.isEmpty()) {
for(i = 0; i < resources.length; i++) {
resource = resources[i];
//try to read
let data = resource.read();
if(data === NO_DATA_AVAILABLE)
//there is no data to read at the moment
continue;
if(data === RESOURCE_CLOSED)
//the resource was closed, remove it from the list
resources.remove(i);
else
//some data was received, process it
consumeData(data);
}
} 7

,2i +i0""i1%1Oi4&1%i1%&0i0&*-)"i1" %+&.2"Oi&1i&0i)/"!6i-,00&)"i1,i%+!)"i!&##"/"+1


!"*2)1&-)"5"/i,/i"3"+1a+,1&#& 1&,+a&+1"/# "Ni%&0i ,*-,+"+1i ,))" 10i+!i.2"2"0i ci
"3"+10i1%1i ,*"i#/,*ii0"1i,#i41 %"!i/"0,2/ "0Oi+!i), (i2+1&)i+"4i"3"+10i/"i3&))"
Non-blocking I/O: event loop
1,i-/, "00Ni%"i#,)),4&+$i&0i1%"i-0"2!, ,!"i,#i+i)$,/&1%*i1%1i20"0ii$"+"/& i06+ %/,+,20
"3"+1i!"*2)1&-)"5"/i1,i/"!i#/,*i14,i!&##"/"+1i/"0,2/ "0P
socketA, pipeB;
watchedList.add(socketA, FOR_READ); //[1]
watchedList.add(pipeB, FOR_READ);
while(events = demultiplexer.watch(watchedList)) { //[2]
//event loop
foreach(event in events) { //[3]
//This read will never block and will always return data
data = event.resource.read();
if(data === RESOURCE_CLOSED)
//the resource was closed, remove it from the watched list
demultiplexer.unwatch(event.resource);
else
//some actual data was received, process it
consumeData(data);
}
}
8
%"0"i/"i1%"i&*-,/1+1i01"-0i,#i1%"i-/" "!&+$i-0"2!, ,!"P
!(+)!c0+c0$!c+ !K&/c(0"+.)

1]0i&+1"/"01&+$i1,i0""i1%1i4&1%i1%&0i-11"/+Oi4"i +i+,4i%+!)"i0"3"/)i ci,-"/1&,+0i&+0&!"


Non-blocking I/O: event loop
i0&+$)"i1%/"!Oi4&1%,21i20&+$ii206f4&1&+$i1" %+&.2"Ni%"i#,)),4&+$i&*$"i0%,40i20
%,4ii4"i0"/3"/i4,2)!i"i)"i1,i%+!)"i*2)1&-)"i ,++" 1&,+0i20&+$ii06+ %/,+,20i"3"+1
!"*2)1&-)"5"/i+!ii0&+$)"i1%/"!P

%"i-/"3&,20i&*$"i%")-0i20i2+!"/01+!i%,4i ,+ 2//"+ 6i4,/(0i&+ii0&+$)"f1%/"!"!


9
--)& 1&,+i20&+$ii06+ %/,+,20i"3"+1i!"*2)1&-)"5"/i+!i+,+f), (&+$i cNi"i +i0""i1%1
20&+$i,+)6i,+"i1%/"!i!,"0i+,1i&*-&/i,2/i&)&16i1,i/2+i*2)1&-)"i ci,2+!i10(0
"i +i+,4i&+1/,!2 "i1%"i/" 1,/i-11"/+Oi4%& %i&0ii0-" &)&71&,+i,#i1%"i)$,/&1%*0
-/"0"+1"!i&+i1%"i-/"3&,20i0" 1&,+Ni%"i*&+i&!"i"%&+!i&1i&0i1,i%3"ii%+!)"/iU4%& %i&+
,!"N'0i&0i/"-/"0"+1"!i6iicallbacki#2+ 1&,+Vi00, &1"!i4&1%i" %i ci,-"/1&,+Oi4%& %
Pattern(reactor) handles I/O by blocking until "!i+!i-/,
4&))i"i&+3,("!i0i0,,+i0i+i"3"+1i&0i-/,!2 new events are available from a set
"00"!i6i1%"i"3"+1i),,-Ni%"
01/2 12/"i,#i1%"i/" 1,/i-11"/+i&0i0%,4+i&+i1%"i#,)),4&+$i&*$"P
of observed resources, and then reacts by dispatching each event to an associated
handler.

10
Module

u Les modules sont les briques pour structurer des applications complexes
u L’un des problèmes majeurs avec JavaScript est l’absence d’espaces de noms
u Une technique populaire pour résoudre ce problème est le patron module
révélateur (The revealing module pattern)
u Définir une partie privée
u exporter l’API publique
u CommonJS modules est la spécification de JS pour implémenter le patron
module
u Node.js construis son système de module au dessus de cette spécification
avec quelques extensions

11
0""+i"#,/"Ni"i-/,3&!"i1%"i*,!2)"i4&1%i1%"imodulei,'" 1i1%1i4"i'201i /"1"!O
+!ii/"#"/"+ "i1,i1%"irequire()i#2+ 1&,+Ni%"i*,!2)"i"5-,/10i&10i-2)& i i6
*+&-2)1&+$i,/i/"-) &+$i1%"imodule.exportsi,'" 1N

Définir un module CommonJS


@N &+))6Oi1%"i ,+1"+1i,#imodule.exportsOi4%& %i/"-/"0"+10i1%"i-2)& i i,#i1%"
*,!2)"Oi&0i/"12/+"!i1,i1%"i ))"/N

0i4"i0""Oi1%"/"i&0i+,1%&+$i*$& )i"%&+!i1%"i4,/(&+$0i,#i1%"i,!"N'0i*,!2)"i0601"*Qi1%"
1/& (i&0i))i&+i1%"i4/--"/i4"i /"1"i/,2+!ii*,!2)"]0i0,2/ "i ,!"i+!i1%"i/1&#& &)
"+3&/,+*"+1i&+i4%& %i4"i/2+i&1N
u Tout est privés dans un module, il faut explicitement indiquer la partie
publique avec la variable module.exports
u
'HILQLQJDPRGXOH
le contenu de cette variable est retourné quand le module défini est importé
avec l’un des mot clés require
6i),,(&+$i1i%,4i,2/i 201,*irequire()i#2+ 1&,+i4,/(0Oi4"i0%,2)!i+,4i(+,4i%,4i1,
!"#&+"ii*,!2)"Ni%"i#,)),4&+$i ,!"i$&3"0i20i+i"5*-)"P
//load another dependency
const dependency = require('./anotherModule');

//a private function


function log() {
console.log(`Well done ${dependency.username}`);
}

//the API to be exported for public use


module.exports.run = () => {
log(); 12
};
module.exports

u la variable module.exports peut contenir des valeurs, des objets ou encore


des fonctions

13
require

u la fonction require permet de charger un module dans un autre


u Si le module n’est pas disponible localement, il faut l’installer avec npm
u elle charge seulement la valeur exportée module.exports
u les éléments de module.exports peuvent être chargés séparément

ship.js

14
npm

u npm (Node Package Manager) est un outils permettant d’installer les package
globalement ou dans un projet
u l’option –global ou –g indique que l’installation est global dans le dossier
d’installation de node
u par défault le package est installé dans un dossier appelé node_modules dans
le répertoire courant
u npm sauvegarde le nom et la version du package installé dans le fichier
package.json
u le fichier package.json doit être crée manuellement

15
Node.js core modules

module description

os fournit des méthodes et des propriétés utilitaires liées au système d’exploitation

process fournit des informations et un contrôle sur le processus Node.js actuel

fs fournit une API pour interagir avec le système de fichiers

zlib offre une fonctionnalité de compression

http fournit une implémentation client/serveur HTTP

16
process

u permet l’accès aux paramètres passés par l’utilisateur dans la ligne de


commande
u ces paramètres sont accessible via le tableau argv
u les variables d’environnement sont accessibles via l’objet env
u il est possible de fermer le processus node avec la fonction exit()

console.log(process.env)
{ SHELL: '/bin/bash’,
node web.js testing app features
USER: 'anna’,
console.log(process.argv[2])
HOME: '/home/anna’,
// Output: testing
LOGNAME: 'anna', ...
}
17
fs

u offre quatre modes pour la manipulation des fichiers


u synchrone
u asynchrone:
u callback
u promises
u stream

18
fs: synchrone

u les noms des fonctions synchrones se termine par Sync


u existsSync(chemin): retourne vrai si le fichier ou le dossier existe
u readFileSync(cheminFichier, options): retourne le contenu du fichier
u writeFileSync(cheminFichier, options, données): écrit les données dans le fichier
u copyFileSync(chemin1, chemin2)
u renameSync(chemin1, chemin2)
u unlinkSync(chemin): supprime le fichier
u mkdirSync(chemin): ajoute un dossier
u rmdirSync(chemin): supprime un dossier

19
exemple

20
fs: asynchrone

u Par défaut, le module fs propose les fonctions asynchrones avec callback


u exists(chemin, callback): retourne vrai si le fichier ou le dossier existe
u readFile(cheminFichier, options, callback): retourne le contenu du fichier
u writeFile(cheminFichier, options, données, callback): écrit les données dans le fichier
u copyFile(chemin1, chemin2, callback)
u rename(chemin1, chemin2, callback)
u unlink(chemin, callback): supprime le fichier
u mkdir(chemin, callback): ajoute un dossier
u rmdir(chemin, callback): supprime un dossier

21
exemple

22
fs.promises: asynchrone avec Promises

u le sous module fs.promises propose les fonctions asynchrones avec Promises


u toutes les fonctions retournent des promesses qui contiennent éventuellement
les résultats
u readFile(cheminFichier, options): retourne le contenu du fichier
u writeFile(cheminFichier, options, données): écrit les données dans le fichier
u copyFile(chemin1, chemin2)
u rename(chemin1, chemin2)
u unlink(chemin): supprime le fichier
u mkdir(chemin): ajoute un dossier
u rmdir(chemin): supprime un dossier

23
24
stream: lecture asynchrone
u L’inconvénient des trois modes précédents est l’utilisation du buffer pour la
lecture est l’écriture
u Le buffer présente les limites suivantes:
u taille limitée
u lecture discontinue
u impossibilité d’utilisation des données avant le remplissage complet du buffer
u La solution est l’utilisation de readStream et WriteStream
u La lecture et l’écriture a partir des streams se fait avec les événements:
u open: événement pour la lecture d’un morceau ‘chunk’ de données reçu sur le flux
u error: événement pour la gestion des erreurs
u Il est possible de lier directement un readStream et un writeStream avec la
fonction pipe
25
exemple

26
zLib

u permet la compression et lé décompression des fichiers en utilisant


u Buffer
u gzipSync(buffer[,options]): retourne le buffer compressé
u gzip(buffer[,options],callback): le buffer compressé est disponible dans le callback
u unzipSynch (buffer[,options]): retourne le buffer décompressé
u unzip (buffer[,options],callback): le buffer décompressé est disponible dans le
callback
u Stream
u createGzip: retourne un objet Gzip qui compresse les fichiers
u createUnzip: retourne un objet Unzip qui décompresse les fichiers

27
exemple

28
exemple 2

29
http

u permet l’implémentation d’un serveur http en node

u server = createServer(callback(req, res)): retourne un serveur et reçoit un callback


qui sera appelé à la réception de chaque requête
u req: représente la requête du client (http.IncomingMessage)
u url
u statusCode
u res: représente la réponse (http.ServerResponse
u write()
u StatutCode
u end()

u server.listen(port[, adresse]): écoute sur une adresse et un port


30
31

Vous aimerez peut-être aussi