# NodeJs ###### tags: `NodeJs` `npm` `gobelins` ## Streams [Trello](https://trello.com/b/d4NoXctD/node-js) upload = petit a petit serveur stream = fur et a mesure Liaison serveur - client Stream = concept : Evenements et fonctions ## Streams types ### Récupérer des données : Readable Données qui peuvent être lues Source de données pas forcément disponibles au même moment Géré par les pipe : Emet des données en continue : mode Flowing (il faut toujours les écouter) => mode par défaut ### Ecrire des données : Writable Destination où je peux ecrire des données petit a petit ### Les deux : Duplex A la fois readable et writable (côte à côte sans se parler) exemple : socket TCP serveur client => chacun envoyer et recevroi des données au travers du socket ### Les deux + autre chose : Transform A la fois readable et writable (ils sont liés) Equivalent d'une fonction ## Opérateur Pipe Permet de connecter deux streams entre eux ReadableSource.pipe(writableSource) Préférer pipeline() ## Code ### Créer un writable dans un fichier ``` //Créer un writable const {Writable,Readable,Duplex,Transform} = require("stream"); const fs = require("fs"); //file contient un writable stream const file = fs.createWriteStream("./big.txt"); //Ecrire dans le writable (écrase toute les données précédentes) file.write("test\n"); //Terminer file.end(); ``` ### Créer des Readables #### Méthode 1 ``` //Créer un writable const {pipeline,Writable,Readable,Duplex,Transform} = require("stream"); //Créer un stream readable (structure de données en mémoire) const inStream = new Readable({ //Implémenter la méthode read read(){} }); //Pousser dans le readable (en interne) inStream.push("ABC"); inStream.push("DEF"); //Envoyer dans la console, lire les données pipeline(inStream,process.stdout,(error) => { console.error(error); }) ``` #### Méthode 2 (meilleure) ``` //Créer un writable const {pipeline,Writable,Readable,Duplex,Transform} = require("stream"); //Créer un stream readable (structure de données en mémoire) const inStream = new Readable({ //Implémenter la méthode read read(size){ this.push(String.fromCharCode(this.currentCharCode++)) } }); inStream.currentCharCode = 65; //Envoyer dans la console, lire les données pipeline(inStream,process.stdout,(error) => { console.error(error); }) ``` ### Créer des Writables ``` //Créer un writable const {pipeline,Writable,Readable,Duplex,Transform} = require("stream"); //Créer un stream writable (structure de données en mémoire) const outStream = new Writable({ //Implémenter la méthode write write(chunk,encoding,callback){ console.log("///\n"+chunk.toString()+"\n"); callback(); } }); //Envoyer dans la console après action dans la console pipeline( process.stdin, outStream, (error) => { console.error(error); }) ``` ### Les deux ``` //Créer un writable const {pipeline,Writable,Readable,Duplex,Transform} = require("stream"); //Créer un stream readable (structure de données en mémoire) const inStream = new Readable({ //Implémenter la méthode read read(size){ this.push(String.fromCharCode(this.currentCharCode++)) } }); inStream.currentCharCode = 65; //Créer un stream writable (structure de données en mémoire) const outStream = new Writable({ //Implémenter la méthode write write(chunk,encoding,callback){ console.log("///\n"+chunk+"\n"); //Dire qu'on a fini de faire qqchose callback(); } }); //Envoyer dans la console pipeline( inStream, outStream, (error) => { console.error(error); }) ``` ### Créer un Duplex Intéressant pour stocker des choses dans un objet et les modifier Exemple : web socket (données dans les deux sens) ``` //Créer un writable const {pipeline,Writable,Readable,Duplex,Transform} = require("stream"); const duplexStream = new Duplex({ //Implémenter la méthode read read(size){ this.push(String.fromCharCode(this.currentCode++)); if(this.currenCharCode > 80){ this.push(null) } }, //Implémenter la méthode write write(chunk,encoding,callback){ console.log("///\n"+chunk+"\n"); //Dire qu'on a fini de faire qqchose callback(); } }); duplexStream.currentCharCode = 65; //Utiliser comme Readable pipeline( duplexStream, process.stdout, (error) => { console.error(error); } ); //Utiliser comme Writable pipeline( process.stdin, duplexStream, (error) => { console.error(error); } ); //Utiliser les deux pipeline( duplexStream, duplexStream, (error) => { console.error(error); } ); ``` ### créer un transform ``` const {pipeline,Writable,Readable,Duplex,Transform} = require("stream"); const transform = new Transform({ //Implémenter la méthode write transform(chunk,encoding,callback){ const data = "///\n"+chunk+"\n"; this.push(data); //Dire qu'on a fini de faire qqchose callback(); } }); //Utiliser comme Readable pipeline( process.stdin, transform, process.stdout (error) => { console.error(error); } ); ``` ## NPM - Installer npm et nodejs - installer npm pour le projet ``` npm init npm install npm i request ```