{"id":1399,"date":"2020-08-17T15:55:04","date_gmt":"2020-08-17T13:55:04","guid":{"rendered":"http:\/\/blogperso.union31.fr\/?p=1399"},"modified":"2020-10-17T10:49:06","modified_gmt":"2020-10-17T08:49:06","slug":"node-js","status":"publish","type":"post","link":"https:\/\/blogperso.union31.fr\/?p=1399","title":{"rendered":"Node.js : les premiers pas"},"content":{"rendered":"\n<p>Bloc notes sur les d\u00e9buts de nodejs<\/p>\n\n\n\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=1399\/#I_Les_urls_visitees_pour_une_premiere_prise_en_main\" >I Les urls visit\u00e9es pour une premi\u00e8re prise en main<\/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=1399\/#II_Installation_sous_Linux_unbutu\" >II Installation sous Linux (unbutu)<\/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=1399\/#III_Hello_World\" >III Hello World<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/blogperso.union31.fr\/?p=1399\/#III_Un_peu_plus_loin_%E2%80%A6\" >III Un peu plus loin &#8230;<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"I_Les_urls_visitees_pour_une_premiere_prise_en_main\"><\/span>I Les urls visit\u00e9es pour une premi\u00e8re prise en main <span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Cours openclassroom : <a rel=\"noreferrer noopener\" href=\"https:\/\/openclassrooms.com\/fr\/courses\/1056721-des-applications-ultra-rapides-avec-node-js\" target=\"_blank\">https:\/\/openclassrooms.com\/fr\/courses\/1056721-des-applications-ultra-rapides-avec-node-js<\/a><ul><li>premiers cours pas \u00e0 pas pour faire sa premi\u00e8re application web fonctionnelle<\/li><li>sont abord\u00e9s :<ul><li>le principe m\u00eame de node.js ;<\/li><li>l&rsquo;installation de node.js ;<\/li><li>le principe de t\u00e9l\u00e9chargement de packages via npm ;<\/li><li>le module express pour la gestion des routes (plus simple que par la voie manuelle) ;<\/li><li>le module ejs pour la gestion des templates ;<\/li><li>le module global PM2 : gestion de l&rsquo;application, red\u00e9marrage automatique et mis en cluster sur les processeurs.<\/li><\/ul><\/li><\/ul><\/li><li>r\u00e9f\u00e9rence javascript : <a rel=\"noreferrer noopener\" href=\"https:\/\/developer.mozilla.org\/fr\/docs\/Web\/JavaScript\" target=\"_blank\">https:\/\/developer.mozilla.org\/fr\/docs\/Web\/JavaScript<\/a><ul><li>toutes les commandes natives de javascript&#8230;<\/li><\/ul><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"II_Installation_sous_Linux_unbutu\"><\/span>II Installation sous Linux (unbutu)<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Installation sous Linux : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Installation de node.js et du gestionnaire de modules npm\nsudo apt-get install nodejs npm\n<\/code><\/pre>\n\n\n\n<p>Installation directement via les sources : <a href=\"https:\/\/github.com\/nodesource\/distributions\/blob\/master\/README.md\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/nodesource\/distributions\/blob\/master\/README.md<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -sL https:\/\/deb.nodesource.com\/setup_12.x | sudo -E bash -\nsudo apt-get install -y nodejs<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"III_Hello_World\"><\/span>III Hello World<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Script de base pour faire un serveur web :<\/p>\n\n\n\n<p>Contenu d&rsquo;un fichier nomme hello.js<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var http = require('http');  \n\nvar server = http.createServer(function(req, res) {\n    res.writeHead(200, {\"Content-Type\": \"text\/html\"});\n    res.end('&lt;p>Hello &lt;strong>World&lt;\/strong> !&lt;\/p>');\n});\nserver.listen(8080);<\/code><\/pre>\n\n\n\n<p>En ligne de commande Node.js, allez dans r\u00e9pertoire du fichier puis lancer la ligne de commande suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>node hello.js<\/code><\/pre>\n\n\n\n<p>Puis lancer un navigateur web \u00e0 l&rsquo;adresse 127.0.0.1:8080 pour voir le r\u00e9sultat.<\/p>\n\n\n\n<p>Remarque importante :  cette application ne fait que \u00e7a, et ce, quelque soit l&rsquo;URL path. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"III_Un_peu_plus_loin_%E2%80%A6\"><\/span>III Un peu plus loin &#8230;<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Pour prendre en compte l&rsquo;URL path par exemple il faut le g\u00e9rer \u00e0 la main, comme le montre l&rsquo;exemple ci-dessous :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var http    = require('http');\nvar url     = require('url');\n\nvar server = http.createServer(function(req, res) {\n    var page = url.parse(req.url).pathname;\n    console.log(page);\n    res.writeHead(200, {\"Content-Type\": \"text\/plain\"});\n    if (page == '\/') {\n        res.write('Accueil de la page');\n    }\n    else if (page == '\/telephone') {\n        res.write('Gestion des t\u00e9l\u00e9phones');\n    }\n    else if (page == '\/television') {\n        res.write('Sommaire des televisions');\n    } else {\n        res.write('Page non existante');\n    }\n    res.end();\n});\nserver.listen(8080);<\/code><\/pre>\n\n\n\n<p>Lorsque l&rsquo;on instancie un objet server par la m\u00e9thode createServer, la fonction callback en param\u00e8tre prend 2 objets :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>un objet de type \u00ab\u00a0request\u00a0\u00bb instanci\u00e9 de la classe http.IncomingMessage (la requete re\u00e7ue au serveur)<ul><li>doc : <a rel=\"noreferrer noopener\" href=\"https:\/\/nodejs.org\/dist\/latest-v12.x\/docs\/api\/http.html#http_class_http_incomingmessage\" target=\"_blank\">https:\/\/nodejs.org\/dist\/latest-v12.x\/docs\/api\/http.html#http_class_http_incomingmessage<\/a><\/li><li>m\u00e9thodes les plus utilis\u00e9es seront :<ul><li>method() : renvoie le type de m\u00e9thode HTML utilis\u00e9 (GET,POST, DELETE, etc)<\/li><li>url() : url demand\u00e9e par le client<\/li><\/ul><\/li><\/ul><\/li><li>un objet de type \u00ab\u00a0response&rsquo; instanci\u00e9 de la classe http.ServerResponse (la r\u00e9ponse envoy\u00e9e par le serveur)<ul><li>doc : <a rel=\"noreferrer noopener\" href=\"https:\/\/nodejs.org\/dist\/latest-v12.x\/docs\/api\/http.html#http_class_http_serverresponse\" target=\"_blank\">https:\/\/nodejs.org\/dist\/latest-v12.x\/docs\/api\/http.html#http_class_http_serverresponse<\/a><\/li><li>m\u00e9thodes les plus utilis\u00e9es seront :<ul><li>writeHead(statusCode[, statusMessage][, headers]) : d\u00e9finit le header de la page html<\/li><li>write(chunk[, encoding][, callback]) : pour \u00e9crire un flux<\/li><li>end([data[, encoding]][, callback]) : pour indiquer au client la fin de la transmission<\/li><\/ul><\/li><\/ul><\/li><\/ul>\n\n\n\n<p>Autre exemple qui affiche les m\u00e9thodes de Response et Request, en sortie HTML et en UTF8 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var http    = require('http');\nvar url     = require('url');\n\nvar server = http.createServer(function(req, res) {\n    \n    var page = url.parse(req.url).pathname;\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    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 += \"URL de la page demand\u00e9e : \" + req.url + \"&lt;br>\"\n    contenu_html += \"URL path de la page demand\u00e9e : \" + page\n    contenu_html +=  \"&lt;br>&lt;br>\"\n    contenu_html += \"&lt;u>Liste des m\u00e9thodes de Request &lt;\/u>: &lt;br>\"\n\n    \/\/ affiche m\u00e9thode de req\n    for (var key in req) {\n        if (!req.hasOwnProperty(key)) {\n           contenu_html += key + \" \"  + \"&lt;br>\"\n        }\n    }\n    contenu_html  += \"&lt;br>&lt;br>\"\n    contenu_html  += \"&lt;u>Liste des m\u00e9thodes de Response &lt;\/u>: &lt;br>\"\n    \/\/ affiche m\u00e9thode de res\n    for (var key in res) {\n        if (!res.hasOwnProperty(key)) {\n           contenu_html += key + \" \"  + \"&lt;br>\"\n        }\n    }\n    \n    contenu_html += \"&lt;\/body>&lt;\/html>\"\n    \n    \/\/ \u00e9crit une sortie\n    res.write(contenu_html);\n\n    \/\/ fin g\u00e9n\u00e9ration sortie\n    res.end()\n});\nserver.listen(8080);<\/code><\/pre>\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_ex3.png\" alt=\"\" class=\"wp-image-1453\" width=\"301\" height=\"281\" srcset=\"https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/Node_js_ex3.png 477w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/Node_js_ex3-300x280.png 300w\" sizes=\"auto, (max-width: 301px) 100vw, 301px\" \/><figcaption>Exemple de sortie HTML g\u00e9n\u00e9r\u00e9e<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Bloc notes sur les d\u00e9buts de nodejs I Les urls visit\u00e9es pour une premi\u00e8re prise en main Cours openclassroom : https:\/\/openclassrooms.com\/fr\/courses\/1056721-des-applications-ultra-rapides-avec-node-js premiers cours pas \u00e0 pas pour faire sa premi\u00e8re application web fonctionnelle sont abord\u00e9s : le principe m\u00eame de<\/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-1399","post","type-post","status-publish","format-standard","hentry","category-_dev"],"_links":{"self":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/1399","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=1399"}],"version-history":[{"count":40,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/1399\/revisions"}],"predecessor-version":[{"id":1680,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/1399\/revisions\/1680"}],"wp:attachment":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1399"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1399"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1399"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}