{"id":1476,"date":"2020-08-19T09:06:42","date_gmt":"2020-08-19T07:06:42","guid":{"rendered":"http:\/\/blogperso.union31.fr\/?p=1476"},"modified":"2020-08-19T18:41:53","modified_gmt":"2020-08-19T16:41:53","slug":"node-js-les-modules-de-base","status":"publish","type":"post","link":"https:\/\/blogperso.union31.fr\/?p=1476","title":{"rendered":"Node.js : les modules int\u00e9gr\u00e9s \u00e0 Node.js"},"content":{"rendered":"\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Sommaire<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/blogperso.union31.fr\/?p=1476\/#I_Les_principaux_modules_presents\" >I Les principaux modules pr\u00e9sents<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/blogperso.union31.fr\/?p=1476\/#II_Module_Http\" >II Module Http<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/blogperso.union31.fr\/?p=1476\/#III_Module_Filesystem\" >III Module Filesystem<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"I_Les_principaux_modules_presents\"><\/span>I Les principaux modules pr\u00e9sents<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Nodes.js comprend plus de 40 modules int\u00e9gr\u00e9s qui sont les suivants :<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Assertion testing<\/td><td>Async hooks<\/td><td>Buffer<\/td><td>C++ addons<\/td><\/tr><tr><td>C\/C++ addons with N-API<\/td><td>Child processes<\/td><td>Cluster<\/td><td>Command line options<\/td><\/tr><tr><td><strong>Console<\/strong><\/td><td>Crypto<\/td><td>Debugger<\/td><td>DNS<\/td><\/tr><tr><td>Domain<\/td><td>ECMAScript modules<\/td><td><strong>Errors<\/strong><\/td><td><strong>Events<\/strong><\/td><\/tr><tr><td><strong>File system<\/strong><\/td><td>Globals<\/td><td><strong>HTTP<\/strong><\/td><td>HTTP\/2<\/td><\/tr><tr><td>HTTPS<\/td><td>Inspector<\/td><td>Internationalization<\/td><td>Modules<\/td><\/tr><tr><td>Net<\/td><td><strong>OS<\/strong><\/td><td><strong>Path<\/strong><\/td><td>Performance hooks<\/td><\/tr><tr><td>Policies<\/td><td>Process<\/td><td>Punycode<\/td><td>Query strings<\/td><\/tr><tr><td>Readline<\/td><td>REPL<\/td><td>Report<\/td><td>Stream<\/td><\/tr><tr><td>String decoder<\/td><td>Timers<\/td><td>TLS\/SSL<\/td><td>Trace events<\/td><\/tr><tr><td>TTY<\/td><td>UDP\/datagram<\/td><td><strong>URL<\/strong><\/td><td>Utilities<\/td><\/tr><tr><td>V8<\/td><td>VM<\/td><td>WASI<\/td><td>Worker threads<\/td><\/tr><tr><td>Zlib<\/td><td><\/td><td><\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Certains modules sont globaux et d&rsquo;autres n\u00e9cessitent une d\u00e9claration (require). La documentation est directement accessible sur le site de <a rel=\"noreferrer noopener\" href=\"https:\/\/nodejs.org\/en\/docs\/\" target=\"_blank\">Node.js<\/a>.<\/p>\n\n\n\n<p>Pour commencer il est n\u00e9cessaire de se pencher sur les modules suivants :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>http ;<\/li><li>url ;<\/li><li>file system ;<\/li><li>console.<\/li><\/ul>\n\n\n\n<p>Ensuite, et en fonction des besoins, voir les autres avant d&rsquo;en t\u00e9l\u00e9charger sur npm par exemple.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"II_Module_Http\"><\/span>II Module Http<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Liens utiles pour commencer :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Vid\u00e9o du site grafikart : <a href=\"https:\/\/www.grafikart.fr\/tutoriels\/http-795\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.grafikart.fr\/tutoriels\/http-795<\/a><\/li><li>Site openclassroom : <a href=\"https:\/\/openclassrooms.com\/fr\/courses\/1056721-des-applications-ultra-rapides-avec-node-js\/1057142-une-premiere-application-avec-node-js\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/openclassrooms.com\/fr\/courses\/1056721-des-applications-ultra-rapides-avec-node-js\/1057142-une-premiere-application-avec-node-js<\/a><\/li><\/ul>\n\n\n\n<p>Exemple d&rsquo;une page simple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var http    = require('http');\n\nvar server = http.createServer(function(req, res) {\n    \n    console.log (\"page accueil\")\n\n    \/\/ pr\u00e9pare le header : r\u00e9ponse ok (code 200) et texte en UTF-8\n    res.writeHead(200, {'Content-Type': 'text\/html; charset=utf-8'})\n    \n    \/\/ pr\u00e9paration contenu HTML\n    let contenu_html = \"\"\n    contenu_html += '&lt;!DOCTYPE html>'\n    contenu_html += '&lt;html>&lt;body>'\n    contenu_html += \"Bonjour \u00e0 tous &lt;br>\"\n    contenu_html +=  \"&lt;br>&lt;br>\"\n    contenu_html += \"&lt;\/body>&lt;\/html>\"\n    \n    \/\/ envoie flux HTML\n    res.write(contenu_html);\n\n    \/\/ indique fin de transmission\n    res.end()\n});\nserver.listen(8080);<\/code><\/pre>\n\n\n\n<p>Conseil :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>faire ses premi\u00e8res armes avec le module http,<\/li><li>passer au module \u00ab\u00a0express\u00a0\u00bb (module externe) qui facilite la vie notemment pour la gestion des routes.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"III_Module_Filesystem\"><\/span>III Module Filesystem<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Module permettant la gestion de fichiers. Module \u00e0 voir absolument car la gestion de fichiers est un incontournable. Il sera utile tant pour la mise en place de template perso, la sauvegarde de fichiers de param\u00e8tres, ma cr\u00e9ation de r\u00e9pertoire, etc&#8230;<\/p>\n\n\n\n<p>Liens utiles :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>doc officielle : <a rel=\"noreferrer noopener\" href=\"https:\/\/nodejs.org\/dist\/latest-v12.x\/docs\/api\/fs.html\" target=\"_blank\">https:\/\/nodejs.org\/dist\/latest-v12.x\/docs\/api\/fs.html<\/a> ;<\/li><li>explication des principales fonctions : <a rel=\"noreferrer noopener\" href=\"https:\/\/oncletom.io\/node.js\/chapter-04\/#fs\" target=\"_blank\">https:\/\/oncletom.io\/node.js\/chapter-04\/#fs<\/a> ;<\/li><li>exemple d&rsquo;impl\u00e9mentation des streams : <a rel=\"noreferrer noopener\" href=\"https:\/\/www.grafikart.fr\/tutoriels\/streams-796\" target=\"_blank\">https:\/\/www.grafikart.fr\/tutoriels\/streams-796<\/a>.<\/li><\/ul>\n\n\n\n<p>Exemple listant les fichiers du r\u00e9pertoire courant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const fs      = require('fs')\nconst path    = require('path')\n\nliste_fichiers_rep_courant1()\n\nfunction liste_fichiers_rep_courant1() {\n\n    \/\/ fichier et r\u00e9pertoire courant vue par Node.js\n    console.log(\"fichier actuel : \" + __filename)\n    console.log(\"r\u00e9petoire actuel : \" + __dirname)\n\n\n    \/\/ liste des fichiers dans le r\u00e9pertoire courant\n    fs.readdir (__dirname, (erreur,fichiers)=> {\n        if (erreur) {\n            console.error(\"Impossible de lister le r\u00e9pertoire\")\n        }\n        \/\/ parcours des fichiers trouv\u00e9s\n        for (var un_fichier in fichiers) {\n       \n            \/\/ Construction du chemin complet du fichier\n            var chemin_fichier = path.join(__dirname,fichiers&#91;un_fichier])\n            \/\/ Information sur le fichier\n            var stat = fs.statSync(chemin_fichier)\n            \/\/ Affichage suivant le type de fichier\n            if (stat.isFile()) {\n                console.log (\"-->fichier : \\t\" + fichiers&#91;un_fichier])\n            }\n            if (stat.isDirectory()) {\n                console.log (\"-->r\u00e9pertoire : \\t\" + fichiers&#91;un_fichier])\n            }\n        }\n    })\n}<\/code><\/pre>\n\n\n\n<p>Ce code utilise la fonction \u00ab\u00a0stats\u00a0\u00bb de mani\u00e8re synchrone, ce qui dans l&rsquo;id\u00e9al devrait se faire en asynchrone.<\/p>\n\n\n\n<p>M\u00eame exemple mais totalement asynchrone :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nconst fs      = require('fs')\nconst path    = require('path')\n\nliste_fichiers_rep_courant2()\n\nfunction liste_fichiers_rep_courant2() {\n    \/\/ fichier et r\u00e9pertoire courant vue par Node.js\n    console.log(\"fichier actuel : \" + __filename)\n    console.log(\"r\u00e9petoire actuel : \" + __dirname)\n    \/\/ liste des fichiers dans le r\u00e9pertoire courant\n    fs.readdir (__dirname, (erreur,fichiers)=> {\n        if (erreur) {\n            console.error(\"Impossible de lister le r\u00e9pertoire\")\n        }\n        \/\/ parcours des fichiers trouv\u00e9s\n        for (var un_fichier in fichiers) {\n            \/\/ Construction du chemin complet du fichier\n            var chemin_fichier = path.join(__dirname,fichiers&#91;un_fichier])\n            \/\/ Affiche le fichier et son type\n            type_fichier(__dirname,fichiers&#91;un_fichier], (fichier,stat)=>{\n                \/\/ Affichage suivant le type de fichier\n                if (stat.isFile()) {\n                    console.log (\"-->fichier : \\t\" + fichier)\n                }\n                if (stat.isDirectory()) {\n                    console.log (\"-->r\u00e9pertoire : \\t\" + fichier)\n                }           \n            })\n        }\n    })\n}\n\nfunction type_fichier(chemin,fichier,callback) {\n    \/\/ reconstitue le chemin complet\n    var chemin_fichier = path.join(chemin,fichier)\n    \/\/ Information sur le fichier\n    var une_stat = fs.stat(chemin_fichier, (err,stat)=> {        \n        \/\/ renvoie fichier + info isdirectory\n        callback(fichier,stat)\n    })\n}<\/code><\/pre>\n\n\n\n<p>Ce qui donne le r\u00e9sultat suivant :<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/node_js_modulefs1.png\" alt=\"\" class=\"wp-image-1490\" width=\"393\" height=\"95\" srcset=\"https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/node_js_modulefs1.png 584w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/node_js_modulefs1-300x72.png 300w\" sizes=\"auto, (max-width: 393px) 100vw, 393px\" \/><\/figure>\n\n\n\n<p>Dernier exemple : lecture d&rsquo;un fichier et affichage web du contenu (en mode asynchrone)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const http    = require('http')\nconst fs      = require('fs')\nconst path    = require('path')\n\n\n\nvar server = http.createServer(function(req, res) {\n\n    \/\/ Ouverture du fichier\n    fs.readFile(\"views\/texte.html\",\"utf-8\",(err,fd)=>{\n        \/\/ pr\u00e9pare le header : r\u00e9ponse ok (code 200) et texte en UTF-8\n        res.writeHead(200, {'Content-Type': 'text\/html; charset=utf-8'})\n        res.write(\"\");\n\n        if (err) {\n            \/\/ Erreur : affiche erreur\n            console.log (\"erreur : \" + err)\n            res.write(\"Erreur : \"+ err)\n        } else {\n            \/\/ pas d'erreur : affiche contenu fichier (qui est du HTML)\n            var contenu_fichier = fd\n            res.write(contenu_fichier)\n        }\n        \/\/ fin g\u00e9n\u00e9ration sortie\n         res.end()\n    })\n\n});\nserver.listen(8080);\n\n<\/code><\/pre>\n\n\n\n<p>Le code va chercher le contenu d&rsquo;une page nomm\u00e9e \u00ab\u00a0texte.html\u00a0\u00bb et stock\u00e9e dans le r\u00e9pertoire views. Ensuite il est affich\u00e9 en mode web.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I Les principaux modules pr\u00e9sents Nodes.js comprend plus de 40 modules int\u00e9gr\u00e9s qui sont les suivants : Assertion testing Async hooks Buffer C++ addons C\/C++ addons with N-API Child processes Cluster Command line options Console Crypto Debugger DNS Domain ECMAScript<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1476","post","type-post","status-publish","format-standard","hentry","category-_dev"],"_links":{"self":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/1476","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1476"}],"version-history":[{"count":20,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/1476\/revisions"}],"predecessor-version":[{"id":1498,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/1476\/revisions\/1498"}],"wp:attachment":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1476"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1476"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1476"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}