Pendant la majeure partie de ma carrière Web, j'ai travaillé exclusivement du côté client. Concevoir des mises en page adaptatives, créer des visualisations à partir de grandes quantités de données, créer des tableaux de bord d'application, etc. Mais je n'ai jamais eu à traiter directement le routage ou les requêtes HTTP. Jusqu'à récemment.
Ce message est une description de la façon dont j'ai appris plus sur le développement Web côté serveur à l'aide de Node.js, et une brève comparaison de l'écriture d'un simple serveur HTTP utilisant 3 environnements différents, Express, Koa.js et Hapi.js.
Remarque: si vous êtes un développeur Node.js expérimenté, vous penserez probablement que tout cela est élémentaire / simple. ¯ \ _ (ツ) _ / ¯.
Quelques bases du réseau
Lorsque j'ai commencé à travailler dans l'industrie du Web il y a quelques années, j'ai rencontré un cours sur les réseaux informatiques par le 
professeur David Veteral sur Coursera. Malheureusement, il n'est plus disponible, mais des conférences sont toujours disponibles sur 
le site Web de Pearson .
J'ai vraiment aimé ce cours car il expliquait ce qui se passait sous le capot d'une manière compréhensible, donc si vous pouvez prendre 
le manuel des 
réseaux informatiques , lisez tous les détails sur les merveilles du réseau.
Ici, cependant, je ne parlerai que brièvement du contexte. 
HTTP (Hypertext Transfer Protocol) est un protocole de communication utilisé dans les réseaux informatiques. Il en existe de nombreux sur Internet, tels que 
SMTP (Simple Mail Transfer Protocol) , 
FTP (File Transfer Protocol) , 
POP3 (Post Office Protocol 3) , etc.
Ces protocoles permettent aux appareils dotés d'un matériel / logiciel complètement différent de communiquer entre eux, car ils fournissent des formats de message, des règles, une syntaxe et une sémantique bien définis, etc. Cela signifie que même si l'appareil prend en charge un protocole spécifique, il peut communiquer avec n'importe quel autre appareil. sur le net.
 De TCP / IP vs OSI: quelle est la différence entre les deux modèles?
De TCP / IP vs OSI: quelle est la différence entre les deux modèles?Les systèmes d'exploitation prennent généralement en charge les protocoles réseau, tels que HTTP, prêts à l'emploi, ce qui explique pourquoi nous n'avons pas besoin d'installer explicitement de logiciel supplémentaire pour accéder à Internet. La plupart des protocoles réseau prennent en charge une connexion ouverte entre deux appareils, ce qui leur permet de transférer des données dans les deux sens.
Le HTTP sur lequel le réseau s'exécute est différent. Il est connu sous le nom de protocole sans connexion car il est basé sur un mode de fonctionnement demande / réponse. Les navigateurs Web envoient au serveur des demandes d'images, de polices, de contenu, etc., mais une fois la demande terminée, la connexion entre le navigateur et le serveur est déconnectée.

Serveurs et clients
Le terme serveur peut être un peu déroutant pour les personnes qui débutent dans l'industrie pour la première fois, car il peut désigner à la fois le matériel (ordinateurs physiques qui hébergent tous les fichiers et logiciels requis par les sites Web) et le logiciel (un programme qui permet aux utilisateurs d'accéder à ces fichiers en ligne).
Aujourd'hui, nous allons parler du côté logiciel des choses. Mais d'abord, quelques définitions. L'URL signifie Universal Resource Locator et se compose de 3 parties: 
protocole , 
serveur et 
fichier demandé .

Structure d'URL
Le protocole HTTP définit plusieurs méthodes que le navigateur peut utiliser pour demander au serveur d'effectuer un tas d'actions différentes, dont les plus courantes sont GET et POST. Lorsqu'un utilisateur clique sur un lien ou entre une URL dans la barre d'adresse, le navigateur envoie une demande GET au serveur pour récupérer la ressource spécifiée dans l'URL.
Le serveur doit savoir comment traiter cette demande HTTP afin de recevoir le fichier correct, puis le renvoyer au navigateur qui l'a demandé. Le logiciel de serveur Web le plus populaire qui gère cela est 
Apache et 
NGINX .
 Les serveurs Web traitent les demandes entrantes et y répondent en conséquence
Les serveurs Web traitent les demandes entrantes et y répondent en conséquenceLes deux sont des progiciels open source complets qui incluent des fonctionnalités telles que les schémas d'authentification, la réécriture d'URL, la journalisation et le proxy, pour n'en nommer que quelques-uns. Apache et NGINX sont écrits en C. Techniquement, vous pouvez écrire un serveur Web dans n'importe quelle langue. 
Python , 
golang.org/pkg/net/http , 
Ruby , cette liste peut durer un certain temps. C’est juste que certaines langues font certaines choses mieux que d’autres.
Création d'un serveur HTTP avec Node.js
Node.js est un runtime Javascript construit sur le 
moteur Javascript Chrome V8 . Il est livré avec le 
module http , qui fournit un ensemble de fonctions et de classes pour la construction d'un serveur HTTP.
Pour ce serveur HTTP de base, nous utiliserons également le 
système de fichiers , le 
chemin et l' 
URL , qui sont des modules natifs Node.js.
Commencez par importer les modules requis.
const http = require('http')  
Nous allons également créer un dictionnaire de types MIME afin de pouvoir attribuer le type MIME approprié à la ressource demandée en fonction de son extension. Une liste complète des types MIME se trouve dans 
Internet Assigned Numbers Authority .
 const mimeTypes = { '.html': 'text/html', '.js': 'text/javascript', '.css': 'text/css', '.ico': 'image/x-icon', '.png': 'image/png', '.jpg': 'image/jpeg', '.gif': 'image/gif', '.svg': 'image/svg+xml', '.json': 'application/json', '.woff': 'font/woff', '.woff2': 'font/woff2' } 
Nous pouvons maintenant créer un serveur HTTP avec la fonction 
http.createServer() , qui retournera une nouvelle instance de 
http.Server .
 const server = http.createServer() 
Nous passerons la fonction de gestionnaire de 
createServer() à 
createServer() avec les objets request et response. Cette fonction est appelée une fois à chaque fois qu'une requête HTTP arrive sur le serveur.
 server.on('request', (req, res) => {  
Le serveur est démarré en appelant la méthode 
listen de l'objet 
server avec le numéro de port sur lequel nous voulons que le serveur écoute, par exemple 
5000 .
 server.listen(5000) 
L'objet de 
request est une instance de 
IncomingMessage et nous permet d'accéder à toutes les informations sur la demande, telles que l'état de la réponse, les en-têtes et les données.
L'objet de 
response est une instance de 
ServerResponse , qui est un 
flux inscriptible et fournit de nombreuses méthodes pour renvoyer des données au client.
Dans le gestionnaire de requêtes, nous voulons effectuer les opérations suivantes:
Tout le code est hébergé sur Glitch, et vous pouvez remixer le projet si vous le souhaitez.
https://glitch.com/edit/#!/node-httpCréation d'un serveur HTTP avec des frameworks Node.js
Les frameworks Node.js tels 
qu'Express , 
Koa.js et 
Hapi.js sont livrés avec diverses fonctions middleware utiles, en plus de nombreuses autres fonctionnalités pratiques qui évitent aux développeurs d'avoir à écrire pour eux-mêmes.
Personnellement, je pense qu'il vaut mieux d'abord apprendre les bases sans framework, juste pour comprendre ce qui se passe sous le capot, puis devenir fou avec n'importe quel framework que vous aimez.
Express a son propre plugin intégré pour servir des fichiers statiques, donc le code requis pour effectuer les mêmes actions que dans son propre Node.js est beaucoup plus court.
 const express = require('express') const app = express()  
Koa.js n'a pas de plugin similaire à l'intérieur de son noyau, donc tout plugin requis doit être installé séparément. La dernière version de Koa.js utilise des fonctions asynchrones en faveur des rappels. Vous pouvez utiliser le plugin 
koa-static pour servir des fichiers statiques.
 const serve = require('koa-static') const koa = require('koa') const app = new koa()  
Hapi.js prend en charge la personnalisation et s'articule autour de la personnalisation de l'objet 
server . Il utilise des plugins pour étendre des fonctionnalités telles que le routage, l'authentification, etc. Pour servir des fichiers statiques, nous avons besoin d'un plugin appelé 
inert .
 const path = require('path') const hapi = require('hapi') const inert = require('inert')  
Chacune de ces plateformes a ses avantages et ses inconvénients, et elles seront plus évidentes pour les applications plus grandes, et pas seulement pour servir une seule page HTML. Le choix de la structure dépendra grandement des exigences réelles du projet sur lequel vous travaillez.
Achèvement
Si le côté réseau des choses a toujours été une boîte noire pour vous, j'espère que cet article pourra servir d'introduction utile au protocole qui fournit le réseau. Je recommande également fortement de lire la 
documentation de l'API Node.js , qui est très bien écrite et très utile pour tout débutant sur Node.js en général.