Comme je ressens votre douleur !
Comme beaucoup, j'ai trouvé qu'il était difficile d'accéder à l'essence de Node.js parce que la plupart des gens n'écrivent/parlent que de la partie de Node qu'ils trouvent utile - et la partie qu'ils trouvent intéressante est généralement un avantage secondaire de Node plutôt que son objectif principal. Je dois dire que je pense qu'il est absurde de dire que Node n'est qu'un moteur d'exécution JavaScript. L'utilisation de JavaScript par Node - et sa sélection du runtime V8 - sont tout simplement un moyen de parvenir à une fin les meilleurs outils pour le problème que les développeurs de Node voulaient résoudre.
L'objectif premier de Node était de rendre plus efficace la gestion des événements des utilisateurs dans une application web. Node est donc à une écrasante majorité utilisé dans le back-end d'une application web. La gestion des événements exige que le serveur soit à l'écoute de ces événements. Un serveur http doit donc être configuré pour acheminer chaque événement vers le gestionnaire approprié script. Node fournit un cadre pour mettre rapidement en place un serveur qui écoute les requêtes des utilisateurs sur un port dédié. Node utilise JavaScript pour le traitement des événements parce que JavaScript permet d'appeler des fonctions en tant qu'objets . Cela permet à la tâche d'être exécutée immédiatement après une requête asynchrone (par exemple, vers un système de fichiers, une base de données ou un réseau), d'être enveloppée dans une fonction et référencée en tant que paramètre de l'appel de fonction de la requête asynchrone.
const mysql = require('mysql2');
const conn = mysql.createConnection(
{
host: "XXXXXXXXXXXXX",
database: "doa_statsbase",
user: "uoalabama_doas",
password: "*************"
});
. . .
. . .
const analyse_bigwheat_farmers = (err, result, fields) =>
{
. . . . .
. . . . .
return data_object;
}
. . .
. . .
let query = "SELECT * FROM us_farmers WHERE acreage > '1000' AND crop='wheat'";
mysql.query(query, (err, result, fields) =>
{
analyse_bigwheat_farmers(err, result, fields);
}
. . .
. . .
. . .
Peu d'autres langages traitent les fonctions comme des objets et ceux qui le font n'ont pas forcément un interpréteur aussi efficace que le runtime V8 de Google. La plupart des développeurs web connaissent déjà JavaScript, il n'est donc pas nécessaire d'apprendre un autre langage avec Node. De plus, le fait d'avoir des fonctions de rappel permet de placer toutes les tâches de l'utilisateur sur un seul thread sans que des blocages explicites soient appliqués aux tâches nécessitant un accès à la base de données ou au système de fichiers. C'est ce qui explique l'efficacité d'exécution supérieure de Node en cas d'utilisation simultanée intensive, ce qui est l'objectif premier de son développement.
Aujourd'hui, la plupart des applications web Node utilisent les callbacks avec parcimonie, car JavaScript ES6 a introduit la fonction Promesse en 2015 pour gérer les appels asynchrones de manière plus simple et plus lisible.
Pour aider les utilisateurs de Node à écrire rapidement du code back-end, les développeurs de Node ont également mis en place une bibliothèque JS intégrée pour les tâches de routine (par exemple, les questions liées aux requêtes HTTP, au (dé)codage de chaînes, aux flux, etc.) et le référentiel NPM (Node Package Manager) : il s'agit d'un ensemble de paquets script open source, maintenus par l'utilisateur, pour diverses fonctions standard et personnalisées. Tous les projets Node permettent d'importer des paquets NPM dans un projet par le biais de la méthode établie npm install commande.
Les demandes des utilisateurs traitées par Node seront des choses nécessaires à l'application web comme l'authentification, l'interrogation de la base de données, les mises à jour du système de gestion de contenu (ApostropheCMS, Strapi CMS), etc. Toutes ces requêtes seront envoyées au port Node. (Lorsque l'analyse des données provenant d'une base de données prend beaucoup de temps CPU, ce type de processus est mieux placé sur un thread séparé afin de ne pas ralentir les requêtes plus simples des utilisateurs). Les autres types de demandes de l'utilisateur, par exemple pour charger une autre page web, télécharger des fichiers CSS/JS/image, etc., continueront d'être envoyées par le navigateur aux ports par défaut (généralement les ports 80 (HTTP) et 443 (HTTPS) sur la machine serveur où le programme du serveur web (Apache, NGinx, etc.) les traitera à la manière d'un site web traditionnel.
[Une remarque sur la transmission des requêtes au serveur. Étant donné que les pare-feu de la plupart des serveurs n'autorisent que les ports par défaut 80/443, il n'est généralement pas possible d'envoyer des requêtes au serveur. directement envoyer une requête Node.js avec un autre port dans l'URL, par exemple https://mynodeapp.com:3001/fetch-members. Si c'était le cas, le pare-feu de la machine serveur l'ignorerait tout simplement, car elle fait directement référence à un port illégal. Au lieu de cela, on peut appliquer une URL à la requête qui n'a pas de numéro de port explicite mais qui contient un nom de dossier virtuel qui identifie l'application Node.js, par exemple https://mynodeapp.com/mynodeapp/fetch-members. Ajoutez ensuite un code de directive serveur dans le fichier .htaccess, comme par exemple :
RewriteEngine On
RewriteRule ^mynodeapp/(.*) https://localhost:3001/$1 [P]
Les requêtes Node.js auxquelles des URL sont données de cette manière trouveront donc leur chemin vers le serveur Node.js de cette application web via les ports désignés pour l'application Node, c'est-à-dire 3001 dans l'exemple ici].
Ainsi, dans la pratique, Node est principalement un cadre pour la création rapide de serveurs et la gestion d'événements, mais qui ne remplace que certaines des fonctions du programme du serveur web.
D'autres utilisations de Node qui ne sont pas des applications dorsales exploitent simplement l'une ou l'autre de ses fonctionnalités, par exemple le moteur JavaScript V8. Par exemple, les outils de construction frontale Grunt y Gulp utiliser une application Node.js frontale pour traiter un script de construction qui peut être codé pour convertir SASS en CSS, minifier les fichiers CSS/JS, optimiser la taille ou le chargement des images, générer des fichiers HTML d'état de page pour rafraîchir les états de page dans un site d'application à page unique, etc. Mais ce type de travail n'est qu'un sous-produit de l'utilisation de Node et non son utilisation principale qui est de créer des processus backend efficaces pour les applications web modernes.