Node JS
Node JS
NODE JS
Claudia Alves
( 2 e édition )
Programmation avec Node.js
Copyright © 2020 par Claudia Alves
Cependant, lorsque nous disons que Node est construit sur le moteur V8,
nous ne voulons pas dire que les programmes Node sont exécutés dans un
navigateur. Ils ne le sont pas. Au contraire, le créateur de Node (Ryan Dahl)
a pris le moteur V8 et l'a amélioré avec diverses fonctionnalités, telles
qu'une API de système de fichiers, une bibliothèque HTTP et un certain
nombre de méthodes utilitaires liées au système d'exploitation.
Cela signifie que Node.js est un programme que nous pouvons utiliser pour
exécuter JavaScript sur nos ordinateurs. En d'autres termes, c'est un runtime
JavaScript.
noeud hello.js
const person = {
first: 'brendan',
last: 'eich',
age: 56,
position: 'CEO of Brave Software',
};
jshint index.js
Vous devriez maintenant voir un certain nombre d'erreurs liées à ES6. Si
vous voulez les réparer, ajoutez / * jshint esversion: 6 * / en haut du fichier
index.js, relancez la commande et le linting devrait réussir.
npm init -y
const _ = require('lodash');
Enfin, exécutez le script à l'aide du nœud test.js. Vous devriez voir la sortie
[1, 2, 3] vers le terminal.
JavaScript est désormais omniprésent en tant que langage de
programmation. La marche triomphale de ce langage de script a commencé
avec l'intégration dans le navigateur web Netscape en 1995. Brendan Eich,
le développeur du langage alors appelé LiveScript, l'a développé pour
effectuer de petites tâches telles que la validation de formulaire directement
dans le navigateur. Depuis, le langage ne s'est répandu que via Internet
Explorer et est désormais disponible sur tous les navigateurs graphiques.
L'étape suivante était que les moteurs JavaScript étaient déclenchés à partir
des navigateurs et utilisés sous une forme différente, comme c'est le cas
avec le V8 -Engin du navigateur Chrome dans Node.js est le cas. Avec cette
approche, Node.js apporte Java Script au serveur. La plate-forme n'est pas
un nouveau développement radical, mais plutôt une collection de diverses
bibliothèques qui ont déjà fait leurs preuves dans la pratique. Si vous vous
êtes déjà demandé ce qu'il y avait derrière Node.js et pourquoi tant
d'entreprises utilisent maintenant même JavaScript côté serveur - zen, vous
êtes au bon endroit. Ce chapitre est destiné à vous donner un aperçu de la
création de Node.js et des concepts sous-jacents. Cependant, ce chapitre
n'est pas absolument nécessaire pour comprendre les chapitres suivants,
vous ne devriez donc pas vous intéresser aux optimisations du moteur
JavaScript qui permettent à Node.js de bien fonctionner ou aux
bibliothèques qui peuvent être utilisées en plus du moteur V8 Vous pouvez
également ignorez ce chapitre et commencez à installer la plate-forme
Node.js au chapitre 2, «Installation».
L'histoire de Node.js
Pour vous aider à mieux comprendre ce qu'est Node.js et à comprendre
comment certaines des décisions de développement ont été prises, vous
pouvez en savoir plus sur l'historique de la plate-forme ici. Le
développement relativement jeune de Node.js est directement lié à son
développeur, Ryan Dahl. Avant de travailler intensivement sur
l'informatique et le développement de Node.js, Ryan Dahl était doctorant en
mathématiques. Mais à un moment donné, il s'est avéré que les
mathématiques n'étaient pas la bonne chose pour lui, il a arrêté ses efforts et
est allé en Amérique du Sud. Avec un aller simple et très peu d'argent en
poche, il a essayé de se débrouiller avec des cours d'anglais. Pendant ce
temps, il a rencontré des développeurs Web qui ont créé des sites Web
dynamiques avec une première version de PHP. Il s'est rendu compte qu'il
était intéressé par la programmation de sites Web et, via PHP, il est
finalement arrivé à Ruby en tant que langage de programmation. Ryan Dahl
dit à propos de Ruby que c'est le langage avec la plus belle syntaxe, mais il
présente des inconvénients majeurs. Avec le framework Rails basé sur
Rubs, il a fait ses premiers pas majeurs dans le développement web.
Cependant, le résultat de ses expériences n'était qu'un site Web productif.
Ryan a rapidement reconnu le plus gros problème de Rails et du Ruby sous-
jacent: les sites Web étaient trop lents et le processeur de son ordinateur
fonctionnait à pleine capacité. Rails était incapable de traiter les demandes
concurrentes sans solutions de contournement, car le noyau sous-jacent
avec Ruby poursuivait une approche à un seul thread, c'est-à-dire qu'il ne
permettait l'exécution qu'une certaine partie de la logique du programme à
la fois et non comme dans les processus d'approche multi-threadés plusieurs
pièces en parallèle. La vraie inspiration est venue de Mongrel, un serveur
Web pour les applications basées sur Ruby. Contrairement aux serveurs
Web classiques, Mongrel répond aux demandes des utilisateurs et génère les
réponses de manière dynamique, sinon seules des pages HTML statiques
sont fournies. Du point de vue d'aujourd'hui, la tâche qui a conduit à la
création de Node.js est assez triviale. En 2005, Ryan Dahl cherchait un
moyen élégant d'implémenter une barre de progression pour les
téléchargements de fichiers. Avec les technologies disponibles à l'époque,
seules des solutions insatisfaisantes étaient possibles. Le protocole HTTP a
été utilisé pour transférer les fichiers pour les fichiers relativement petits et
le protocole FTP pour les fichiers plus volumineux. L'état du
téléchargement a été interrogé à l'aide d'une longue interrogation. Il s'agit
d'une technique dans laquelle le client envoie des demandes de longue
durée au serveur et le serveur utilise le canal ouvert pour les réponses. Une
première tentative de Ryan Dahl pour implémenter une barre de progression
trouvée dans Mongrel. Après avoir envoyé le fichier au serveur, il a vérifié
l'état du téléchargement à l'aide d'un grand nombre de requêtes Ajax et l'a
représenté graphiquement dans une barre de progression. Cependant,
l'implémentation de l'approche monothread de Ruby et le grand nombre de
requêtes ont été de nouvelles tentatives pour résoudre le problème de la
barre de progression, mais cette fois dans d'autres langages de
programmation. La mise en œuvre en C offrait une approche prometteuse.
Ici, Ryan Dahl ne s'est pas limité à un fil. Cependant, le langage C en tant
que langage de programmation pour le Web présente un inconvénient
majeur: il y a pas mal de développeurs qui sont enthousiasmés par ce
domaine d'application. Ryan Dahl a été confronté à ce problème et a
rapidement rejeté cette approche. La recherche d'un langage de
programmation approprié pour résoudre son problème s'est poursuivie et l'a
conduit vers des langages de programmation fonctionnels tels que Haskell.
L'approche de Haskell est basée sur des E / S non bloquantes, ce qui signifie
que toutes les opérations d'écriture et de lecture se déroulent de manière
asynchrone et ne bloquent pas l'exécution du programme. Cela permet au
langage de rester mono-thread à son cœur, et ne donne pas lieu aux
problèmes qui découlent de la programmation parallèle. Entre autres
choses, aucune ressource n'a besoin d'être synchronisée et aucun problème
n'est causé par l'exécution des threads parallèles. Cependant, Ryan Dahl
n'était toujours pas entièrement satisfait de cette solution et cherchait
d'autres options. Ryan Dahl a finalement trouvé la solution finale en janvier
2009 en utilisant Java Script. Ici, il est devenu clair pour lui que ce langage
de script pouvait répondre à toutes ses exigences. JavaScript était établi sur
le Web depuis des années, il disposait de moteurs puissants et d'un grand
nombre de programmeurs. C'est ainsi qu'au début de 2009, il a commencé à
travailler sur son implémentation pour JavaScript côté serveur, la naissance
de Node.js. Une autre raison en faveur de l' implémentation de la solution
en Java Script, selon Ryan Dahl, était le fait que les développeurs
JavaScript ne fournissaient pas ce domaine d'application. À cette époque, il
n'existait pas de serveur Web natif en JavaScript, les fichiers d'un système
de fichiers ne pouvaient pas être traités et il n'y avait pas d'implémentation
de sockets pour communiquer avec d'autres applications ou systèmes. Tous
ces points plaident en faveur de JavaScript comme base d'une plateforme
d'applications web interactives, après quoi aucune stipulation n'a été faite
dans ce domaine et par conséquent aucune erreur n'a été commise.
L'architecture de JavaScript parle également d'une telle implémentation.
L'approche des fonctions de haut niveau, c'est-à-dire des fonctions qui ne
sont pas liées à un objet et qui sont donc librement disponibles et peuvent
également être affectées à des variables, offre une grande flexibilité de
développement. En plus du moteur JavaScript chargé d'interpréter le code
JavaScript, Ryan Dahl a sélectionné d'autres bibliothèques et les a
regroupées sur une seule plateforme. Une fois tous les composants intégrés
et des exemples exécutables créés sur la nouvelle plate-forme Node.js, Ryan
Dahl avait besoin d'un moyen de présenter Node.js au public. Cela est
devenu nécessaire car ses ressources financières ont considérablement
diminué en raison du développement de Node.js et s'il ne pouvait pas
trouver de sponsors, il devrait arrêter de travailler sur Node.js. Il a choisi la
conférence JavaScript jsconf.eu à Berlin en novembre 2009 comme
plateforme de présentation. Ryan Dahl a tout mis sur une seule carte.
Le cœur - le moteur V8
Pour que vous, en tant que développeur, puissiez évaluer si une technologie
peut être utilisée dans un projet, vous devez être suffisamment familiarisé
avec les spécifications de cette technologie. Les sections suivantes traitent
des éléments internes de Node.js et sont destinées à vous montrer de quels
composants la plate-forme est construite et comment vous pouvez l'utiliser
à l'avantage d'une application est le moteur JavaScript V8 développé par
Google. Pour plus d'informations, consultez la page du projet V8 à l'adresse
https://code.google.com/p/v8/. Le moteur JavaScript est responsable de
l'interprétation et de l'exécution du code source JavaScript. Pour JavaScript,
il n'y a pas qu'un seul moteur, mais les différents fabricants de navigateurs
s'appuient sur leur propre implémentation. L'un des problèmes avec Java
Script est que les moteurs individuels se comportent quelque peu
différemment. La standardisation selon ECMAScript tente de trouver un
dénominateur commun fiable, de sorte que vous, en tant que développeur
d'applications JavaScript, ayez moins à vous soucier. La concurrence des
moteurs JavaScript a conduit à un certain nombre de moteurs optimisés, qui
visent tous à interpréter le code JavaScript le plus rapidement possible. Au
fil du temps, certains moteurs se sont imposés sur le marché. Ceux-ci
incluent Chakra de Microsoft, JägerMonkey de Mozilla, Nitro d'Apple et le
moteur V8 de Google. Node.js utilise le moteur V8 de Google. Ce moteur
est développé par Google depuis 2006 principalement au Danemark en
collaboration avec l'université d'Aarhus. Le principal domaine d'application
du moteur est le navigateur Chrome de Google, où il est responsable de
l'interprétation et de l'exécution du code JavaScript. L'objectif du
développement d'un nouveau moteur JavaScript était d'améliorer
considérablement les performances d'interprétation de JavaScript, la
cinquième version de la norme ECMAScript ECMA-262. Le moteur V8
lui-même est écrit en C ++, fonctionne sur différentes plates-formes et est
disponible sous la licence BSD en tant que logiciel open source pour
chaque développeur pour sa propre utilisation et amélioration. Par exemple,
vous pouvez intégrer le moteur dans n'importe quelle application C ++.
Comme d'habitude en JavaScript, le code source n'est pas compilé avant
l'exécution, mais les fichiers avec le code source sont lus directement au
démarrage de l'application. Au démarrage de l'application, un nouveau
processus Node.js est lancé, où la première optimisation par le moteur V8 a
lieu. Le code source n'est pas interprété directement, mais d'abord traduit en
code machine, qui est ensuite exécuté. Cette technologie est connue sous le
nom de compilation juste à temps, ou JIT en abrégé, et est utilisée pour
augmenter la vitesse d'exécution de l'application Java Script. L'application
proprement dite est ensuite exécutée sur la base du code machine compilé.
En plus de la compilation juste à temps, le moteur V8 effectue également
d'autres optimisations. Entre autres choses, il s'agit d'un garbage collection
amélioré et d'une amélioration de l'accès aux propriétés des objets. Pour
toutes les optimisations effectuées par le moteur JavaScript, vous devez
noter que le code source est lu au début du processus et que les
modifications apportées aux fichiers n'ont donc aucun effet sur l'application
en cours d'exécution. Pour que vos modifications prennent effet, vous devez
terminer votre application et recommencer afin que les fichiers de code
source adaptés soient à nouveau lus.
Le modèle de mémoire
L'objectif du développement du moteur V8 était d'atteindre la vitesse la plus
élevée possible lors de l'exécution du code source JavaScript. Pour cette
raison, le modèle de mémoire a également été optimisé. Les soi-disant
TaggedPointers sont utilisés dans le moteur V8. Ce sont des références dans
la mémoire qui sont marquées comme telles d'une manière spéciale. Tous
les objets sont alignés sur 4 octets, ce qui signifie que 2 bits sont
disponibles pour le marquage des pointeurs. Un pointeur se termine
toujours dans le modèle de mémoire du moteur V8 à »01«, une valeur
entière normale à »0«. Cette mesure signifie que les valeurs entières
peuvent être distinguées très rapidement des références dans la mémoire, ce
qui présente un très grand avantage en termes de performances. Les
représentations d'objets du moteur V8 en mémoire se composent chacune
de trois mots de données. Le premier mot de données consiste en une
référence à la classe cachée de l'objet, sur laquelle vous en apprendrez plus
ci-dessous. Le deuxième mot de données est un pointeur vers les attributs,
c'est-à-dire les propriétés de l'objet. Le troisième mot de données fait
finalement référence aux éléments de l'objet. Ce sont les propriétés avec
une clé numérique. Cette structure prend en charge le moteur JavaScript
dans son travail et est optimisée de manière à ce que les éléments de la
mémoire soient accessibles très rapidement et qu'il y ait peu de temps
d'attente lors de la recherche d'objets.
Prototypes en JavaScript
JavaScript diffère des langages tels que C, Java ou PHP en ce qu'il ne suit pas une approche
basée sur les classes, mais s'appuie sur des prototypes tels que le languageSelf. En JavaScript,
chaque objet a généralement une propriété prototype et donc un prototype. Vous pouvez créer
des objets en JavaScript comme dans d'autres langages. Dans ce but, cependant, n'utilisez pas
de classes en relation avec le nouvel opérateur. Au lieu de cela, vous pouvez créer de nouveaux
objets de différentes manières. Entre autres choses, vous pouvez également utiliser des
fonctions constructeur ou la méthode Object.create . Ces méthodes ont en commun de créer un
objet et d'affecter le prototype. Le prototype est un objet dont un autre objet hérite de ses
propriétés. Une autre caractéristique des prototypes est qu'ils peuvent être modifiés au moment
de l'application et que vous pouvez ajouter de nouvelles propriétés et méthodes. En utilisant
des prototypes, vous pouvez créer une hiérarchie d'héritage dans Java Script. Voir Section
4.2.2, «Utilitaire», pour plus d'informations sur la façon dont Node.js peut vous aider avec
l'héritage basé sur des prototypes.
Boucle d'événement
Le JavaScript côté client comporte de nombreux éléments d'une architecture
événementielle. La plupart des interactions de l'utilisateur provoquent des
événements auxquels les appels de fonction correspondants répondent. En
utilisant diverses fonctionnalités telles que des fonctions de première classe
et des fonctions anonymes dans JavaScript, vous pouvez implémenter des
applications entières basées sur une architecture événementielle. Piloté par
les événements signifie que les objets ne communiquent pas directement via
des appels de fonction, mais que des événements sont utilisés pour cette
communication. La programmation événementielle est principalement
utilisée pour contrôler le déroulement du programme. Contrairement à
l'approche classique, dans laquelle le code source linéaire est exécuté, les
fonctions sont exécutées ici lorsque certains événements se produisent. Un
petit exemple dans Listing illustre cette approche.
Vous pouvez utiliser la sur la méthode d'un objet que vous tirez de
events.EventEmitter pour définir la fonction avec laquelle vous souhaitez
réagir à l'événement respectif. Il s'agit d'un modèle dit de publication-
abonnement. Les objets peuvent s'inscrire auprès d'un émetteur
d'événements et sont ensuite notifiés lorsque l'événement se produit. Le
premier argument de la sur la méthode est le nom de l'événement en tant
que chaîne à répondre. Le deuxième argument consiste en une fonction de
rappel qui est exécutée dès que l'événement se produit. L'appel de fonction
de la sur la méthode ne fait que enregistrer la fonction de rappel la
première fois qu'il est exécuté. Plus tard dans le script wirdauf myObj la
emit méthode appelée. Cela garantit que toutes les fonctions de rappel
enregistrées par la sur la méthode sont exécutées. Ce qui fonctionne dans
cet exemple avec un objet auto-créé est utilisé par Node.js pour effectuer
diverses tâches asynchrones. Les fonctions de rappel ne sont cependant pas
exécutées en parallèle, mais séquentiellement. L' approche monothread de
Node.js crée le problème qu'une seule opération peut être effectuée à la fois.
En particulier, des opérations de lecture ou d'écriture chronophages
garantiraient que l'exécution entière de l'application serait bloquée. Pour
cette raison, toutes les opérations de lecture et d'écriture sont externalisées à
l'aide de la boucle d'événements. De cette manière, le thread disponible peut
être utilisé par le code de l'application. Dès qu'une requête est faite à une
ressource externe dans le code source, elle est transmise à la boucle
d'événements. Un rappel est enregistré pour la requête, qui la transmet au
système d'exploitation, Node.js reprend alors le contrôle et peut poursuivre
l'exécution de l'application. Dès que l'opération externe est terminée, le
résultat est renvoyé dans la boucle d'événements. Un événement se produit
et la boucle d'événements garantit que les fonctions de rappel associées sont
exécutées. La boucle d'événements originale utilisée dans Node.js est basée
sur libev, une bibliothèque écrite en C et pour des performances élevées et
un large éventail de fonctionnalités. libev s'appuie sur les approches de
libevent, mais a des performances supérieures à celles de divers documents
de référence. Même une version améliorée de libevent, libevent2, ne
correspond pas aux performances de libev. Pour des raisons de
compatibilité, la boucle d'événements a cependant été abstraite et une
meilleure portabilité vers d'autres plates-formes a été obtenue.
Entrée et sortie
La boucle d'événements seule en combinaison avec le moteur V8 permet
d'exécuter JavaScript, mais il n'y a toujours aucun moyen d'interagir avec le
système d'exploitation directement sous la forme d'opérations de lecture ou
d'écriture sur le système de fichiers. Lors de la mise en œuvre d'applications
côté serveur, l'accès au système de fichiers joue un rôle primordial, par
exemple, la configuration d'une application est souvent externalisée vers un
fichier de configuration distinct. Cette configuration doit être lue par
l'application à partir du système de fichiers. Mais aussi l'utilisation de
modèles dynamiques. Les valeurs remplies puis envoyées au client sont
généralement disponibles sous forme de fichiers séparés. Non seulement la
lecture, mais aussi l'écriture d'informations dans des fichiers est souvent une
exigence placée sur une application JavaScript côté serveur. La
journalisation au sein d'une application est également un domaine
d'utilisation fréquent pour l'accès en écriture au système de fichiers.
Différents types d'événements au sein de l'application sont enregistrés dans
un fichier journal. Selon l'endroit où l'application s'exécute, seules les
erreurs graves, les avertissements ou les informations d'exécution sont
écrits. L'accès en écriture est également utilisé pour conserver les
informations. Pendant l'exécution d'une application, des informations sont
générées, généralement via l'interaction des utilisateurs et divers calculs, qui
doivent être enregistrées pour une utilisation ultérieure. La bibliothèque C
libeio est utilisée dans Node.js pour ces tâches. Il garantit que les opérations
d'écriture et de lecture peuvent se dérouler de manière asynchrone et
fonctionne donc très étroitement avec la boucle d'événements. Cependant,
les fonctionnalités de libeio ne sont pas seulement limitées à l'accès en
lecture et en écriture au système de fichiers, mais offrent également
beaucoup plus d'options d'interaction avec le système de fichiers. Ces
options vont de la lecture des informations sur les fichiers, telles que la
taille, la date de création ou la date d'accès, à la gestion des répertoires,
c'est-à-dire la création ou la suppression, à la modification des droits
d'accès. Comme pour la boucle d'événements, cette bibliothèque lui
applique également pendant le processus de développement une couche
d'abstraction a été séparée de l'application réelle. Node.js fournit son propre
module, le module du système de fichiers, pour accéder au système de
fichiers. Les interfaces de libeio peuvent être adressées via ceci, ce qui en
fait un wrapper très léger autour de libeio.
Libuv
Les deux bibliothèques que vous avez apprises jusqu'à présent s'appliquent
à Linux.Node.js mais devraient devenir une plate-forme indépendante du
système d'exploitation, c'est pourquoi la bibliothèque libuv a été introduite
dans la version 0.6 de Node.js. Il est principalement utilisé pour résumer les
différences entre les différents systèmes d'exploitation. L'utilisation de libuv
permet à Node.js de s'exécuter sur les systèmes Windows. La structure sans
libuv, telle qu'elle était valable pour Node.js jusqu'à la version 0.6,
ressemble à ceci: Le noyau est le moteur V8, qui est complété par libev et
libeio avec la boucle d'événements et l'accès asynchrone au système de
fichiers. Avec libuv, ces deux bibliothèques ne sont plus directement
intégrées à la plateforme, mais sont abstraites. Pour que Node.js fonctionne
sous Windows, il est nécessaire de rendre les composants principaux
disponibles pour les plates-formes Windows. Le moteur V8 n'est pas un
problème ici, il fonctionne dans le navigateur Chrome depuis plusieurs
années sans problème sous Windows. La situation devient plus difficile
avec la boucle d'événements et les opérations de système de fichiers
asynchrones. Certains composants de libev devraient être réécrits lorsqu'ils
sont utilisés sous Windows. Libev est également basé sur des
implémentations natives du système d'exploitation de la fonction de
sélection , mais sous Windows IOCP est une variante optimisée pour le
système d'exploitation. Afin de ne pas avoir à créer différentes versions de
Node.js pour les différents systèmes d'exploitation, les développeurs ont
décidé d'ajouter une couche d'abstraction avec libuv qui permet d'utiliser
libev pour les systèmes Linux et IOCP pour Windows. Certains concepts de
base de Node.js ont été adaptés avec libuv. Par exemple, on ne parle plus
d'événements, mais d'opérations. Une opération est transmise au composant
libuv, dans libuv l'opération est transmise à l'infrastructure sous-jacente,
c'est-à-dire libev ou IOCP. Ainsi, l'interface de Node.js reste inchangée,
quel que soit le système d'exploitation utilisé. Libuv est responsable de la
gestion de toutes les opérations d'E / S asynchrones. Cela signifie que tous
les accès au système de fichiers, qu'il soit en lecture ou en écriture, sont
effectués via les interfaces libuv. Pour cela, libuv fournit les fonctions
uv_fs_ . Cependant, les temporisateurs, c'est-à-dire les appels dépendant du
temps et les connexions TCP et UDP asynchrones, fonctionnent également
via libuv. En plus de ces fonctionnalités de base, libuv gère également des
fonctionnalités complexes telles que la création, le frai, les processus
enfants et la planification des pools de threads, une abstraction qui permet
d'exécuter des tâches dans des threads séparés et des rappels y sont liés.
L'utilisation d'une couche d'abstraction comme libuv est un élément
important pour la diffusion ultérieure de Node.js et rend la plate-forme un
peu moins dépendante du système.
DNS
Les racines de Node.js se trouvent sur Internet, comme son histoire le
montre. Si vous vous déplacez sur Internet, vous rencontrerez rapidement le
problème de la résolution de noms . En fait, tous les serveurs sur Internet
sont adressés via leur adresse IP. Dans la version 4 du protocole Internet,
l'adresse est un nombre de 32 bits qui est représenté en quatre blocs de 8
bits chacun. Dans la sixième version du protocole, les adresses ont une
taille de 128 bits et sont divisées en huit blocs avec des nombres
hexadécimaux. Dans les cas les plus rares, vous souhaitez travailler
directement avec ces adresses cryptées, en particulier si l'attribution
dynamique est ajoutée via DHCP. La solution à cela est le système de noms
de domaine, ou DNS en abrégé. Le DNS est un service de résolution de
noms dans le réseau. Il garantit que les noms de domaine sont convertis en
adresses IP. Il existe également l'option de résolution inverse, dans laquelle
une adresse IP est traduite en nom de domaine. Si vous connectez un
service Web dans votre application Node.js ou que vous souhaitez lire un
site Web, le DNS est également utilisé ici. En interne, Node.js ne prend pas
en charge la résolution de nom elle-même, mais transfère les requêtes
respectives à la bibliothèque C-Ares. Ceci s'applique à toutes les méthodes
du module dns à l' exception de dns.lookup , qui repose sur la fonction
getaddrinfo du système d' exploitation . Cette exception est due au fait que
getaddrinfo est plus constant dans ses réponses que la bibliothèque C-Ares,
qui à son tour est beaucoup plus performante que getaddrinfo .
1.5.5Crypto Le composant crypto de la plate-forme Node.js vous offre
diverses options de cryptage pour le développement. Ce composant est
basé sur OpenSSL. Cela signifie que ce logiciel doit être installé sur votre
système afin de crypter les données. Avec le module crypto, vous pouvez
crypter des données avec différents algorithmes ainsi que créer des
signatures numériques au sein de votre application. L'ensemble du système
est basé sur des clés privées et publiques. Comme son nom l'indique, la clé
privée n'est destinée qu'à vous et à votre application. La clé publique est
disponible pour vos partenaires de communication. Si le contenu doit
maintenant être chiffré, cela se fait avec la clé publique. Les données ne
peuvent alors être déchiffrées qu'avec votre clé privée. Il en va de même
pour la signature numérique des données. Votre clé privée est utilisée ici
pour générer une telle signature. Le destinataire d'un message peut alors
utiliser la signature et votre clé publique pour déterminer si le message
provient de vous et est inchangé.
Zlib
Lors du développement d'applications Web, en tant que développeur, vous
devez toujours penser aux ressources de vos utilisateurs et à votre propre
environnement serveur. Par exemple, la bande passante disponible ou la
mémoire libre pour les données peut signifier une limitation. Dans ce cas, le
composant Zlib existe dans la plate-forme Node.js. Avec leur aide, les
données peuvent être compressées et décompressées lorsque vous souhaitez
les traiter. Les deux algorithmes Deflate et Gzip sont disponibles pour la
compression de données. Les données utilisées comme entrée pour les
algorithmes sont traitées comme des flux par Node.js. Node.js n'implémente
pas les algorithmes de compression lui-même, mais s'appuie à la place sur
le Zlib établi et transmet les requêtes. Le module zlib de Node.js est juste
un wrapper léger pour le Zlib et garantit que les flux d'entrée et de sortie
sont gérés correctement.
Analyseur HTTP
En tant que plate-forme pour les applications Web, Node.js doit non
seulement gérer les flux, les données compressées et le cryptage, mais
également le protocole HTTP. L'analyse du protocole HTTP étant une
procédure très complexe, l'analyseur HTTP, qui prend en charge cette tâche,
a été externalisé vers un projet séparé et est désormais intégré par la
plateforme Node.js. Comme les autres bibliothèques externes, l'analyseur
HTTP est écrit en C et sert d'outil performant pour lire les requêtes et les
réponses du protocole HTTP. Pour vous en tant que développeur, cela
signifie que vous pouvez utiliser l'analyseur HTTP, par exemple, pour lire
vous-même les différentes informations de l'en-tête HTTP ou le texte du
message. Le principal objectif de développement de Node.js est de fournir
une plate-forme haute performance pour les applications Web. Pour
répondre à cette exigence, Node.js s'appuie sur une approche modulaire.
Cela permet l'intégration de bibliothèques externes telles que la libuv déjà
décrite ou le HTTP-Par-ser. L'approche modulaire est poursuivie par les
modules internes de la plateforme Node.js et s'étend aux extensions que
vous créez pour votre propre application. Au cours de ce livre, vous
apprendrez à connaître les différentes possibilités et technologies que la
plate-forme Node.js vous offre pour développer vos propres applications.
Cela commence par une introduction au système de modules de Node.js.
Sommaire
Dans ce chapitre, vous avez appris comment Node.js est structuré et quels
avantages vous obtenez de cette structure. Vous avez également appris
quelques faits sur l'historique de développement de la plateforme. Dans le
chapitre suivant, vous apprendrez comment installer Node.js sur votre
système et comment vous pouvez tester les fonctionnalités de cette
installation.
CHAPITRE 1
Installation
Les composants de Node.js ont été développés en C ++. Cela signifie que la
plate-forme entière est fondamentalement relativement indépendante du
système d'exploitation sur lequel elle s'exécute. Cette indépendance de
plate-forme signifie que vous pouvez installer Node.js sur des systèmes
UNIX tels que Linux ou Mac OS X ainsi que sur Windows. Node.js a été
initialement développé pour être installé et utilisé sur les systèmes UNIX.
Vous pouvez toujours déterminer cette origine car certaines fonctionnalités
ne sont pas disponibles sous Windows. Par exemple, diverses fonctions du
module de processus ne sont pas disponibles. Vous pouvez observer une
autre différence dans le module fs , qui fournit la fonctionnalité de système
de fichiers pour Node.js. La fonctionnalité de montre actuellement encore
instable est basée sur les interfaces fournies par le système d'exploitation et
se comporte donc quelque peu différemment sur les différents systèmes. En
résumé, on peut dire que Node.js fonctionne de manière stable et fiable sur
les trois plates-formes mentionnées. Lorsque vous utilisez les différentes
fonctionnalités, en tant que développeur, vous devez toujours consulter la
documentation de l'API à l'adresse http://nodejs.org/api/ pour vous assurer
que les fonctionnalités respectives sont également disponibles sur votre
système cible de la manière attendue.En ce qui concerne la gestion des
versions, Node .js suit l'approche classique. Cela signifie qu'un numéro de
version de Node.js se compose de trois parties: la version majeure, la
version mineure et le niveau du correctif. Le nom d'un package Node.js, tel
qu'il est disponible sur le site Web Node.js, se compose comme suit: node-v
<major>. <mineur>. <patch>, suivi principalement d'informations sur le
système d'exploitation et l'architecture cible. Par exemple, pour un système
Linux avec un processeur 64 bits, cela conduit au nom suivant: node-
v0.10.9-linux-x64.tar.gz. Une augmentation de la version majeure signifie
que dans notre cas, il y a eu de sérieux changements à Node.js et il ne peut
être garanti que les applications existantes peuvent être exécutées sans
ajustements importants. L'indication de la version mineure a deux
significations: Premièrement, une augmentation de ce numéro de version
indique que Node.js a des améliorations et améliorations supplémentaires,
et deuxièmement, les numéros de version signifient qu'il s'agit d'une version
stable de Node.js. Une version mineure étrange signifie que vous utilisez la
branche développeur de Node.js. Le niveau du correctif est augmenté assez
souvent, il indique seulement que la version utilisée contient les plus petites
mises à jour et corrections de bogues. Selon les explications précédentes,
encore assez théoriques, les sections suivantes traitent de l'installation de la
plateforme Node.js. À la fin de ce chapitre, vous devriez avoir une
installation fonctionnelle de Node.js installée sur votre système, que vous
utilisiez Linux, Mac OS X ou Windows. Tout au long de ce chapitre, vous
serez guidé étape par étape tout au long du processus d'installation.
L'installation des packages pour votre système d'exploitation respectif est
principalement traitée. Vous apprendrez également comment compiler et
installer le code source sur votre système.
Installation de packages
Le moyen le plus simple d'installer Node.js sur votre système consiste à
utiliser les packages existants pour votre système. L'avantage de ceci est
que vous pouvez utiliser le gestionnaire de paquets de votre système, qui
effectue la plupart du travail pour vous pendant l'installation. Vous n'avez
pas à vous soucier de la résolution des dépendances ici et pouvez donc
installer Node.js sur votre système en quelques lignes sur la ligne de
commande ou en quelques clics, selon le système d'exploitation que vous
utilisez. Node.js est un projet open source et est donc disponible
gratuitement sur le site http://nodejs.org/download/. Ici, vous pouvez
télécharger les packages pour différents systèmes d'exploitation et
architectures informatiques sur votre ordinateur en utilisant les liens
respectifs. La figure montre le tableau des différentes versions disponibles
au téléchargement.
les fenêtres
À l'origine, Node.js n'était disponible que sous Linux. Si vous vouliez
l'installer sous Windows, vous n'aviez pas d'autre choix que d'utiliser
Cygwin pour l'exécuter. Vous pouvez trouver ce projet à l'URL
http://www.cygwin.com/. Cygwin a fourni un environnement similaire à
Linux sous Windows pour exécuter le logiciel Linux ici. Avec la version
0.6, beaucoup de choses se sont passées concernant le support des
différentes plates-formes. L'introduction de la bibliothèque libuv, dont vous
avez pris connaissance dans la section 1.5.3, et donc l'abstraction de libev et
libeio, a permis d'exécuter Node.js nativement sous Windows, et sans
aucune solution de contournement supplémentaire ni logiciel
supplémentaire. Vous pouvez maintenant télécharger un package binaire
exécutable à partir de Node.js ainsi qu'un package .msi pour installer
Node.js à partir de la page de téléchargement Node.js. Node.js peut
fonctionner sur presque toutes les plates-formes Windows. La prise en
charge va de Windows2000 à Windows 8 pour les systèmes de bureau.
Node.js peut également être installé sur les systèmes serveur Windows.
Node.js est également disponible sur la plateforme cloud Microsoft Azure,
de sorte que les applications cloud avec Node.js sont également possibles.
Le moyen le plus simple d'exécuter Node.js sous Windows consiste à
utiliser le package binaire. Il vous suffit de le télécharger et de l'utiliser sans
autre installation. Node.js peut alors être démarré de deux manières
différentes, soit en double-cliquant sur le fichier node.exe, soit via la ligne
de commande. Le Listing 2.7 montre comment vous pouvez vérifier si
Node.js fonctionne sur votre système. Ici, on suppose que Filenode.exe se
trouve directement sur votre disque dur. Vous pouvez également enregistrer
le fichier dans n'importe quel répertoire.
C: \> node.exe –v
v0.10.9
Lors de l'installation avec le package .msi, veuillez noter que Node.js est
désormais disponible à l'échelle du système sur la ligne de commande et
que vous n'avez pas besoin d' ajuster les variables d'environnement. Vous
pouvez maintenant commencer à implémenter votre première application
avec Node.js. Si à tout moment vous souhaitez supprimer Node.js de votre
système, ce n'est pas non plus un problème. Selon la façon dont vous avez
procédé à l'installation, vous pouvez choisir l'une des deux options pour
supprimer Node.js de votre système Windows. Si vous définissez les
binaires Windows de Node.j, il vous suffit de supprimer le fichier node.exe
de votre système. Si vous avez installé Node.js via le package .msi sur votre
système, vous pouvez utiliser Windows Software Management pour
supprimer Node.js. Vous pouvez accéder au Panneau de configuration dans
Windows 8 via l'Explorateur Windows en sélectionnant Ordinateur sur la
gauche et l'élément de menu Ordinateur, puis en cliquant sur Panneau de
configuration. Vous pouvez y obtenir une vue d'ensemble via le lien
Désinstaller le programme sous l'élément Programmes, dans lequel vous
devez sélectionner le programme Désinstaller sous Programmes et
fonctions pour obtenir une liste de tous les composants logiciels installés
sur votre système. Il y a une entrée dans cette liste appelée Node.js.
Sélectionnez ceci, puis cliquez sur Désinstaller, supprimez Node.js de votre
système. Le reste du chapitre traite de l'installation de Node.js sur Mac OS
X et de la compilation de Node.js à partir des fichiers source. Si vous
voulez commencer à développer directement avec Node.js, vous pouvez
continuer avec le chapitre 3, "Un premier exemple".
Mac OS X
Pour Mac OS X, comme pour Windows, vous pouvez télécharger un
package binaire et un package d'installation pour l'installation. Le moyen le
plus simple d'exécuter Node.js sur Mac OS X consiste à utiliser le package
binaire. Le paquet se présente sous la forme d'une archive tar compressée et
il vous suffit de le décompresser sur la ligne de commande, comme vous
pouvez également le voir dans le Listing 2.9.
$ tar xvzf node-v0.10.9-darwin-x64.tar.gz
$ cd node-v0.10.9-darwin-x64
$ bin / node - v
v0.10.9
$ echo $ PATH
/ usr / bin: / bin: / usr / sbin: / sbin: / usr / local / bin: / usr / X11 / bin
Si vous avez suivi les étapes pour installer Node.js comme décrit, vous
pouvez maintenant utiliser la plateforme. Pour vous assurer que la version
actuelle a vraiment été installée et que Node.js fonctionne correctement,
vous pouvez afficher les informations de version sur la ligne de commande.
Le Listing 2.11 montre comment faire cela.
$ node - v
v0.10.9
Compiler et installer
Dans cette section, vous apprendrez comment ne pas exécuter Node.js à
l'aide de packages binaires ou en l'installant avec un programme
d'installation pour votre système, mais comment créer une installation
personnalisée à partir des fichiers source de votre système. Ci-dessous, vous
apprendrez comment compiler Node.js sur un système Linux. Pour cela,
une installation standard d'un bureau Ubuntu en version 12.04 LTS est
supposée. La première étape de l'installation est que vous devez télécharger
le code source à partir de Node.js. Ceci est disponible sur nodejs.org dans la
zone de téléchargement en tant qu'archive tar compressée. Avant de pouvoir
commencer à compiler Node.js, vous devez vous assurer que vous disposez
d'un compilateur. Par défaut, ce n'est pas le cas avec la version de bureau
d'Ubuntu, mais vous pouvez installer le compilateur plus tard à l'aide du
gestionnaire de paquets du système. Le Listing 2.15 montre la ligne de
commande requise pour cela.
$ sudo apt-get install g ++
Une fois cette condition préalable remplie, vous pouvez extraire le package
de code source, comme vous pouvez le voir dans la liste, et basculer vers le
répertoire résultant.
$ tar xvzf node-v0.10.9.tar.gz
$ cd node-v0.10.9
La première étape du processus de compilation proprement dit consiste à
créer un makefile. Ce fichier est utilisé ultérieurement par la commande
make comme base pour la traduction de Node.js. Cependant, vous ne devez
pas créer le fichier Make manuellement, le programme configure existe
pour cela. Des informations supplémentaires relatives à l'installation
peuvent être transmises à cette commande, par exemple les options --
without-npm pour éviter d'installer le gestionnaire de packages de Node.js,
ou --without-ssl pour installer Node.js sans SSL à construire. Il existe
également la possibilité d'intégrer diverses bibliothèques telles que V8,
OpenSSL ou zlib en tant que bibliothèques partagées au lieu de les lier
statiquement. Avec l'option --dest-cpu = vous pouvez choisir l'architecture
cible, les valeurs possibles ici sont pauvres , ia32 et x64 . Vous pouvez
également sélectionner le système d'exploitation pour lequel Node.js doit
être construit. Dans ce cas, vous pouvez passer l'option --dest-os = à win ,
mac ou linux , entre autres. Une option importante pour configure est --
prefix . Cela spécifie l'emplacement où Node.js doit être installé. Si vous
n'utilisez pas cette option, le standard / usr / local est utilisé. Par rapport à ce
chemin, tous les fichiers de Node.js sont copiés sur le système. Vous pouvez
utiliser cette option pour garder l'option ouverte pour installer plusieurs
versions de Node.js sur votre système. Avec la commande ./configure--help,
vous obtenez une liste de toutes les options de configuration disponibles, y
compris une brève explication. La liste montre les prochaines étapes du
processus.
$ ./configure --prefix = / opt / node / node-v0.10.9
{'target_defaults': ...
$ make
python tools / gyp_node -f make
... $ sudo make install
make -C out BUILDTYPE = Release V = 1
...
Comme déjà mentionné, la première commande de la liste, configure , est
utilisée pour créer le makefile pour Node.js. L'option prefix = / opt / node /
node-v0.10.9 USAGE-pour faire cela afin que Node.js s'installe dans un
répertoire séparé. Ces informations sont enregistrées dans le makefile. La
commande suivante, make , s'appuie sur les informations du Makefile,
recherche la première cible et construit le projet en fonction des
informations présentes, dans votre cas Node.js. Le but de cette étape du
processus est d'obtenir une version exécutable de Node.js, qui se trouve
cependant toujours dans le répertoire dans lequel vous vous trouvez
actuellement, c'est-à-dire dans le code source décompressé. La dernière
commande, makeinstall , garantit enfin que les fichiers compilés sont
copiés au bon endroit dans le système. Pour cette raison, vous devez
également exécuter makeinstall avec les privilèges root, car un utilisateur ne
devrait normalement pas avoir accès en écriture à / opt, votre cible
d'installation actuelle. Après ces étapes, vous devez créer un nouveau
répertoire sur votre système dans le répertoire / opt. noeud de dessin peut
voir. Votre Node.js. est maintenant dans ceci Vous pouvez tester cela en
exécutant la commande node avec l' option -v dans le sous-répertoire
node-v0.10.9 / bin. Vous recevrez le numéro de version de votre installation
Node.js en sortie. Si ce test a fonctionné, vous pouvez supprimer le
répertoire contenant le code source extrait de votre système, car vous n'avez
plus besoin des deux. Comme avec les packages binaires sous Linux, cette
variante d'installation présente également le problème que vous ne pouvez
pas exécuter Node.js à l'échelle du système à partir de la ligne de
commande, mais devez toujours spécifier le chemin d'accès au fichier
exécutable en entier. La section suivante de ce chapitre est consacrée à ce
problème. Avec l'installation dans le répertoire / opt, vous avez la possibilité
d'exécuter plusieurs versions de Node.js en parallèle sur votre système. Si
vous souhaitez développer une application qui devrait fonctionner sur
différentes versions de Node.js et que vous souhaitez tester cela, vous
pouvez le faire. Par exemple, vous pouvez exécuter une version de 0.6, une
de 0.8 et une de 0.10. Normalement, cependant, vous souhaitez
probablement avoir la dernière version de Node.jsglobal disponible sur
votre système. Le moyen le plus simple et le plus rapide de le faire est
d'avoir un lien symbolique vers la version de Node.js que vous souhaitez
avoir globalement disponible et d'inclure ce lien symbolique dans le chemin
de recherche de votre système. Cette procédure vous permet de changer la
version de Node.js en ajustant ce lien. Le listing 2.18 montre comment créer
le lien.
$ ln -s /opt/node/node-v0.10.9 / opt / node / node
Sommaire
Au cours de ce chapitre, vous avez vu à quel point il est facile d'installer
Node.js sur votre système. Peu importe que vous exécutiez un système
Windows, Linux ou Mac OS X. Il existe plusieurs façons d'installer Node.js
sur votre système. Les variantes vont de la simple installation des packages
binaires, qu'il vous suffit de décompresser sur votre système, à la
compilation et à l'installation du code source de Node.js. En fonction de la
variante d'installation que vous avez choisie, vous pouvez également
supprimer le logiciel installé de votre système. Dans le chapitre suivant,
vous verrez comment vous pouvez développer une première application
avec Node.js en fonction de votre installation.
.
CHAPITRE 2
Un premier exemple
Si nous nous efforçons de trouver l'inconnu, alors nous serons courageux,
meilleurs et plus actifs que ceux qui pensent que l'inconnu ne peut être
trouvé. - Plato Si vous êtes arrivé ici, vous devriez déjà avoir une
installation fonctionnelle de la plate-forme node .js sur votre système. Pour
les exemples suivants, Node.js est utilisé sur la ligne de commande d'un
système Linux. Cependant, les exemples fonctionnent de la même manière
sous Windows et Mac OS X. Vous pouvez utiliser Node.js de deux
manières différentes. D'une part, il y a un shell interactif et d'autre part, il
existe un mode dans lequel au lieu d'une interaction de l'utilisateur, un
fichier avec le code source JavaScript est passé et doit être exécuté.
Le mode interactif
Tout d'abord, en savoir plus sur le mode interactif de Node.js. Vous pouvez
y parvenir, comme vous pouvez le voir dans le Listing 3.1, en entrant le
noeud de commande sur la ligne de commande.
$ node>
En mode interactif, vous pouvez directement saisir et exécuter du code
JavaScript sur la ligne de commande. Ce type d'interface utilisateur est
appelé REPL. L'acronyme signifie Read-Eval-Print Loop et signifie que les
commandes dos sont lues sur la ligne de commande, puis évaluées, et le
résultat est ensuite sorti sur la ligne de commande. Ce mode n'est pas
destiné à implémenter et exécuter des applications complètes. Au lieu de
cela, cette interface Node.js est utilisée pour tester le comportement et la
fonctionnalité des extraits de code individuels. La liste vous montre
comment émettre des commandes dans Node.js REPL
$ node>
console.log ( "Hello world!");
Hello World!
Undefined
>
Dans le Listing 3.3, vous pouvez voir comment définir une fonction dans
Node.js REPL, qui reçoit un nom en paramètre, et comment elle est sortie
sur la console pendant la fonction. Après la définition, la fonction greet est
appelée avec l'argument world comme nom. La sortie se compose de
HalloWelt et indéfini . Si vous souhaitez exécuter diverses commandes
dans Node.js REPL qui se construisent les unes sur les autres, vous pouvez
facilement le faire. Par exemple, si vous définissez des fonctions ou
effectuez une affectation de variables, celles-ci sont conservées même après
l'évaluation de la ligne de commande. Vous pouvez voir comment ce fait
fonctionne réellement dans Listing.
$ node
> var myVar = "Hello world!";
Undefined
> console.log (myVar);
Hello World!
Undefined
>
Dans l'exemple du Listing 3.4, vous attribuez une valeur à la variable
myVar . Cette variable sera utilisée dans l'instruction suivante de la sortie.
L'une des fonctionnalités les plus importantes de Node.js REPL est la saisie
semi-automatique. Vous pouvez utiliser cette fonctionnalité en tapant des
lettres sur la ligne de commande et en appuyant sur la touche Tab. Node.js
montre les ajouts disponibles. Une autre caractéristique à mentionner est les
commandes multi-lignes. Comme vous pouvez le voir dans le Listing 3.3, le
code de fonction n'est pas entré sur une seule ligne, mais sur plusieurs
lignes. Une commande incomplète est indiquée par trois points au lieu du
signe supérieur à comme invite de commande. Les commandes multilignes
peuvent être atteintes, par exemple, via des blocs de code incomplets ou un
opérateur plus pour le calcul ou la concaténation de chaînes à la fin de la
ligne. L'une des particularités de Node.js REPL est qu'en plus du jeu de
commandes JavaScript, il vous donne également quelques commandes
supplémentaires pour contrôler les offres REPL. La commande dos
commence toujours par un point et ne doit pas nécessairement se terminer
par un point-virgule. Le tableau 3.1 vous présente un aperçu de ces
commandes.
Le Listing 3.6 montre comment vous pouvez utiliser .load et .save . Pour
illustrer le déploiement, exécutez la commande console.log au début. La
session en cours est ensuite enregistrée dans le fichier myShell.js. Ce fichier
contient alors la ligne de commande telle que vous l'avez entrée dans le
REPL, mais pas la sortie associée. Dans l'étape suivante, charger ce fichier
de retour dans la session avec l' .load instruction. Le fichier est lu ligne
par ligne, chaque commande est exécutée et les sorties associées sont
affichées. Vous pouvez également utiliser denBefehl .load à un point de
départ spécifique pour préparer un essai. Pour cela, vous pouvez formuler
une série de commandes dans un fichier, par exemple pour définir des
variables ou des fonctions dont vous avez besoin au cours d'une session
dans Node.js REPL. Comme d'habitude en JavaScript, Node.js REPL offre
également un contexte global, au début certaines variables sont déjà
enregistrées, ce qui vous facilite la tâche en tant que développeur. L' objet
de processus est à votre disposition avec lequel vous pouvez lire des méta-
informations sur le processus Node.js en cours, comme le numéro de
version. Vous pouvez également charger des fonctionnalités
supplémentaires à l'aide de require . La fonctionnalité exacte de ces
fonctionnalités sera discutée plus en détail au cours de ce livre. Dans la
portée globale de Node.js REPL, la variable _ est une autre particularité.
Cette variable contient toujours la valeur de la dernière commande. Par
exemple, si vous exécutez la commande console.log , _ contient la valeur
non définie . Si vous appelez une méthode ou une méthode avec une valeur
de retour telle que process.uptime () , _ contient la valeur respective. Avec
Node.js REPL comme outil, vous pouvez facilement tester le code source et
voir de manière interactive comment la plate-forme Node.js se comporte
dans certaines situations. Le REPL Node.js n'est pas adapté aux
applications étendues. Dans ce cas, une autre façon d'exécuter Node.js est
utilisée. Vous en apprendrez plus à ce sujet dans les sections suivantes.
La première application
Si vous créez des applications avec Node.js, le code source de cette
application est disponible dans un ou plusieurs fichiers. Celles-ci sont
transmises à Node.js lorsque l'application est lancée en tant qu'option sur la
ligne de commande et lue et exécutée par le processus. Le fichier d'entrée
contient uniquement du code source JavaScript valide. Le Listing3.7 vous
montre comment exécuter une application avec Node.js.
$ node server.js
Hello World!
$
$ node webserver.js
Web server is running.
Le problème maintenant est que votre serveur Web est lié à la bonne
adresse et au bon port, mais n'a aucune logique pour traiter les demandes
entrantes. Cela signifie principalement que vous n'obtenez aucune sortie
pendant le test et, si vous laissez la fenêtre de votre navigateur ouverte
assez longtemps, vous obtenez une erreur de temporisation. Pour cette
raison, vous insérerez le code source à l'étape suivante, ce qui garantit que
les demandes entrantes sont traitées de manière significative. Le serveur
Web que vous créez ici dans Node.js diffère considérablement dans
certaines caractéristiques des autres implémentations dans les langages de
script dynamiques tels que PHP. Chaque demande est traitée séparément et
le code source nécessaire est lu. Avec Node.js, le code de l'application est lu
une fois puis reste dans la mémoire de travail. L'application s'exécute en
continu. C'est là qu'entre en jeu un aspect important de Node.js: le
traitement asynchrone des tâches. Le serveur Web répond aux événements,
dans ce cas les requêtes des clients. Pour cela, une fonction est définie, un
callback qui est exécuté dès qu'une requête arrive. Bien que ce code soit
défini dans un bloc comme dans d'autres langages, le code source
responsable du traitement des requêtes n'est exécuté que lorsqu'une telle
requête arrive. Dans la liste, vous pouvez voir le code source étendu de la
liste. Cette version du serveur Web peut alors traiter correctement les
demandes.
var http = require ('http');
http.createServer (function (request, response) {
response.writeHead (200, {'content-type': 'text / plain; charset = utf-8'});
response.write ('Hello'); response.end ('World \ n');
})
.lists (8080, '127.0.0.1');
console.log ( 'Web server is running.');
L'adaptation la plus importante du code source est que vous lisez l'URL
demandée par le client dans le code source et que vous en écrivez des
parties dans la réponse. L'objet de requête contient les informations que
l'URL l'utilisateur a spécifiées dans son navigateur de la propriété url . En
supposant que l'utilisateur a entré l'URL http: // localhost: 8080 /? Nom =
visiteur dans la ligne d'adresse de son navigateur, la propriété url de l'objet
de requête contient la valeur /? Nom = visiteur . Votre objectif est
maintenant de sortir la chaîne Bonjour visiteur . Pour ce faire, la chaîne,
dans ce cas visiteurs , doit être extraite de la propriété url . Vous pouvez le
faire d'une part en fractionnant la chaîne avec la fonction de fractionnement
au signe égal et en utilisant le deuxième élément du tableau résultant.
Cependant, cette variante ne fonctionne que tant que l'utilisateur ne passe
qu'un seul paramètre dans l'URL ou est au sommet de plusieurs paramètres.
Une meilleure façon de traiter avec des URL est d'utiliser le module Node.js
URL . Entre autres choses, cela vous donne la possibilité d'analyser les
URL et de les décomposer en leurs composants individuels. Tout ce que
vous avez à faire est d'inclure le module url et d' appeler la méthode d'
analyse sur l'objet retourné avec la propriété url de l'objet request comme
argument. Cela conduit à la ligne de code suivante: varurl = require ('url')
.parse (request.url, true) . La variable url contient alors un objet qui
contient les différentes parties de l'URL demandée. Entre autres choses, il
existe une propriété de requête qui contient les paramètres GET
individuels. Dans ce cas, le nombre et l'ordre des paramètres dans l'URL
n'ont plus d'importance, puisque vous pouvez accéder à la valeur via le nom
du paramètre, nom dans ce cas. Avec url.query .name vous pouvez alors
accéder à la chaîne de caractères que l'utilisateur a spécifiée dans la ligne
d'adresse de son navigateur. Vous disposez désormais de tous les
composants nécessaires pour atteindre votre objectif. Une fois que vous
avez apporté les modifications au code source et redémarré le serveur Web,
vous pouvez tester le résultat en appelant à nouveau la page. La figure 3.4
montre le résultat que vous obtenez lorsque vous accédez à http: //
localhost: 8080 /? Nom = utilisateur.
Sommaire
Dans ce chapitre, vous avez appris à créer des applications Web simples
avec Node.js avec seulement quelques lignes de code source et même à
réagir aux entrées de l'utilisateur. Dans les chapitres suivants, vous aurez un
aperçu plus approfondi de la structure de Node.js, du concept de module et
du gestionnaire de paquets Node.js.
.
CHAPITRE 3
Adaptation et expansion
Modules Node.js
Dans le chapitre précédent, vous avez utilisé deux modules différents, le
module http et le module URL . Ces modules fournissent des
fonctionnalités ou des interfaces supplémentaires et fréquemment utilisées
aux bibliothèques principales de Node.js. Les sections suivantes traitent en
détail du système de modules de Node.js et des possibilités qui en
découlent.
Approche modulaire
Le cœur de la plate-forme Node.js se compose d'une collection de
différentes bibliothèques, qui sont gérées séparément et finalement
rassemblées dans Node.js. Node.js suit également une approche similaire
dans son système de modules. La plupart des modules individuels sont
développés indépendamment les uns des autres, mais sont disponibles sur la
plateforme et peuvent être combinés selon les besoins. Les modules font
partie intégrante de la plateforme Node.js et sont donc compilés directement
dans le fichier binaire. Ils sont donc à votre disposition à tout moment. Vous
n'avez pas non plus la possibilité d'exclure certains modules pendant le
processus de compilation. Les modules Node.js sont développés en
JavaScript lui-même. Cela signifie que bien que le cœur de la plate-forme
soit en C, les composants restants sont développés dans le langage de la
plate-forme, c'est-à-dire inJavaScript. Dans l'architecture de Node.js,
comme le montre la figure, vous vous déplacez dans la partie supérieure de
ce chapitre, c'est à dire dans la bibliothèque standard de Node.js. Cela
signifie que les modules Node.js sont disponibles dans le code source et que
vous pouvez également les adapter à vos besoins si nécessaire, et tout ce
dont vous avez besoin est une solide connaissance de JavaScript. Les
fichiers des modules se trouvent dans le répertoire lib du package de code
source de Node.js.
Comme vous l'avez vu au chapitre 3, les modules Node.js sont très faciles à
intégrer en utilisant la fonction require . La fonctionnalité est rendue
disponible via la valeur de retour. Dans la plupart des cas, il s'agit d'un objet
dont les méthodes peuvent être utilisées directement. Le listing 4.1 vous
montre comment utiliser le module du système de fichiers pour lire le
fichier /tmp/nodejs.txt.
var fs = require ('fs');
fs.readFile ("/tmp/nodejs.txt", function (err, content)
{
if (err) {throw err;
}
console.log ( content.toString ());
});
Dans l'exemple du Listing 4.1, chargez le module du système de fichiers
dans la première ligne en utilisant la commande require ('fs') . La valeur de
retour de cette fonction est un objet qui vous fournit une interface pour
diverses opérations du système de fichiers. Entre autres, il y a la méthode
readFile , que vous utilisez dans ce cas pour lire un fichier et afficher son
contenu sur la ligne de commande, mais comment savoir quels modules
sont disponibles, à quoi ils servent et sous quel nom vous pouvez charger
les modules? Les modules de Node.js sont très bien documentés dans la
documentation API de la plateforme Node.js. Vous pouvez les joindre à
l'adresse http://nodejs.org/api/. Une alternative à cela est disponible si vous
avez téléchargé le code source à partir de Node.js. Dans le répertoire doc, il
y a un sous-répertoire api dans lequel toute la documentation API de
Node.js est disponible hors ligne. Vous pouvez consulter cette
documentation via le fichier index.html dans ce répertoire. Le contenu
correspond à celui du site Web Node.js, mais est spécifique à la version
dans le package de code source. Cela signifie que vous devriez vous référer
à cette documentation si vous développez pour une ancienne version de
Node.js ou si vous avez besoin d'informations sur l'API d'un ancien
Node.js.
Indice de stabilité
Une question fréquemment posée est de savoir si Node.js peut être utilisé
dans les entreprises. Cette question ne peut recevoir une réponse claire et
sans ambiguïté. A travers le développement de la plateforme et les
tentatives de rendre Node.js plus stable et performant, la tendance va
néanmoins dans le sens de répondre à la question par un oui. Le fait
d'utiliser ou non une technologie dépend de divers facteurs, notamment la
nature du problème, l'environnement dans lequel la solution doit être
utilisée et notamment les technologies Entwicklungsstandder utilisées. Une
situation similaire à celle de la question de l'utilisabilité de l'ensemble de la
plateforme Node.js se pose également avec les modules de Node.js. Étant
donné que les modules ont été développés indépendamment, faites-les
chacun à des stades de développement différents, ce qui se reflète dans la
stabilité des modules. Les modules qui ont été développés pendant plusieurs
années et qui ont déjà fait leurs preuves à plusieurs reprises dans la pratique
sont, bien entendu, plus stables et plus fiables que les modules qui ne sont
entrés sur la plate-forme que dans l'une des dernières versions. Les
développeurs de Node.js sont conscients de ce problème et ont développé
ce que l'on appelle l'indice de stabilité. C'est un nombre que vous pouvez
utiliser pour déterminer si un module est si mature que vous pouvez
l'utiliser dans votre application sans problème majeur, ou si vous devriez
plutôt attendre pour l'utiliser et passer à d'autres alternatives. Le tableau 4.1
vous fournit une liste des numéros d'indice de stabilité existants.
Modules disponibles
Node.js est livré avec un certain nombre de modules de base. Dans cette
section, vous en apprendrez plus sur les modules individuels et leurs
domaines d'application. Le tableau vous donne un premier aperçu des
modules existants et où ils sont utilisés.
Dans l'exemple, vous définissez une fonction qui renvoie true si le premier
argument est supérieur au second, sinon le résultat est false . Cette valeur
de retour peut être vérifiée avec la méthode ok de l' objet assert en passant
l'appel de fonction ou la valeur de retour comme premier argument. Dans le
cas de l'exemple, vous vous attendez à ce que le test échoue car 2 n'est pas
supérieur à 3. Si un test échoue, une exception AssertionError est levée et
le message que vous avez transmis à la méthode ok en tant que deuxième
argument s'affiche.
Tampon
Sur Internet, les flux d'octets sont un moyen établi de transfert de données,
ce qui est déjà reflété dans l' application / flux d'octets de type MIME , qui
est utilisé lorsque des fichiers dont le format est inconnu sont transmis.
Dans Node.js, les flux d'octets sont principalement utilisés dans le domaine
de la communication réseau et pour les opérations du système de fichiers.
La classe tampon est dans Node.js alsglobale classe disponible et ne dispose
pas sur nécessitent intégré werden.In Listing 4.3 voir la représentation d'un
objet tampon.
<Buffer 48 61 6c 6c 6f 20 57 65 6c 74 0a>
Dans cet exemple, vous pouvez voir une autre fonctionnalité de la classe
Buf-fer avec la méthode isBuffer . Il peut être utilisé pour vérifier si un
objet spécifique est réellement un objet tampon.
Processus enfant
Une caractéristique centrale de Node.js est l'approche monothread, qui est
chargée de s'assurer que tout le code de l'application est exécuté dans un
thread Node.js. Cependant, dans Node.js, vous avez la possibilité de
démarrer des processus enfants indépendants. D'une part, il peut s'agir de
commandes normales, dont la sortie sera disponible plus tard, et d'autre
part, de processus Node.js séparés qui peuvent être utilisés pour sous-traiter
des opérations intensives en calcul. Côté client, il existe une option en
HTML5 avec la fonction de travail Web pour externaliser les opérations
gourmandes en calculs. Au chapitre 7, »Programmation asynchrone«, vous
apprendrez en détail quand et comment vous pouvez utiliser le module
ChildProcess dans votre application.
Grappe
Le module de cluster est un module Node.js assez récent. Il a été intégré
dans la version 0.6 de Node.js et a subi de nombreux changements et
optimisations depuis. Cette évolution reflète également l'indice de stabilité
«expérimental» de ce module. Le module de cluster prend en compte le
fait que les ordinateurs modernes ont non seulement un cœur de processeur,
mais plusieurs. Cependant, vous ne pouvez pas facilement utiliser cette
infrastructure avec Node.js, car le code de l'application est connu pour
s'exécuter dans un seul thread. Le module de cluster garantit qu'une série
de processus de travail est démarrée, sur laquelle la charge de travail de
l'application est répartie. Ce module s'appuie directement sur le module
ChildProcess pour démarrer les processus enfants et leur permettre de
communiquer entre eux . L'équilibrage de charge des processus est effectué
par le système d'exploitation lui-même, de sorte que vous n'ayez pas à vous
en soucier. Cependant, l'utilisation de ce module influence l'architecture de
votre application, car vous devez décider à quel moment quelles parties de
l'application doivent être externalisées du processus principal. Vous devez
également gérer vous-même les processus enfants, ce n'est pas fait par
Node.js. Pour un aperçu détaillé de ce module, vous devriez jeter un œil au
chapitre 7, «Programmation asynchrone», où vous pouvez en savoir plus
sur l'utilisation et les fonctionnalités du module de cluster à l' aide d'un
exemple.
Console
Vous avez utilisé certaines des fonctionnalités de ce module plus
fréquemment tout au long de ce livre. Le module Console fournit l' objet
console globale , que vous pouvez utiliser pour générer des informations,
par exemple. Pour la non-reproduction, la sortie standard est au-dessus de
console.log ou console.info ainsi que l'erreur standard sur Console.Error
ou console.warn pour la disponibilité vérifiée-gung. L'API des commandes
de la console correspond à celle qui est également utilisée dans les
navigateurs Web standard. Pendant le développement, ce qui est très utile
pour mesurer les temps de débit, les fonctions console.time et
console.timeEnd sont disponibles , qui vous fournissent une sorte de
chronomètre, avec lequel vous pouvez mesurer une certaine période de
temps au sein d'une application. console.time console.time ('example');
var result = 0;
for ( vari = 1; i <= 1000; i ++) {
result + = i;
}
console.log ( 'Sum:' + result);
console.timeEnd ('example');
Crypto
Dans les applications Web, en tant que développeur, vous devez toujours
gérer des données confidentielles dont vous êtes responsable de la
transmission et du stockage en toute sécurité. Un traitement sécurisé des
données est également possible sous Node.js, qui ne doit pas être rendu
accessible à toutes les personnes ayant accès à l'application ou au serveur.
Basé sur OpenSSL, le module Crypto fournit des interfaces avec lesquelles
vous pouvez crypter des données et créer des signatures ou des hachages.
L'exemple du Listing 4.6 montre comment vous pouvez facilement créer le
hachage MD5 d'une chaîne de caractères.
var crypto = require ('crypto');
var md5 = crypto.createHash ('md5');
md5.update ('Hello world');
console.log (md5.digest ('hex'));
Dans la liste, vous créez un nouvel objet de hachage à l'aide du module
Crypto et de la méthode createHash . Vous passez l'algorithme souhaité
comme argument à cette méthode. Les valeurs possibles ici incluent sha1 et
md5 . Vous utilisez ce dernier dans cet exemple pour former un hachage
sur la chaîne de caractères HalloWelt . À l'étape suivante, les données sont
écrites dans l'objet de hachage à l'aide de la méthode de mise à jour . La
méthode digest est en dernier lieu responsable du calcul de la valeur de
hachage et des retours. Si vous appelez cette méthode sans arguments, le
hachage est codé en binaire. Cependant, il est possible d'influencer le type
de codage de sortie avec des arguments. Dans l'exemple, vous avez utilisé
la valeur hex pour générer un hachage hexadécimal. La sortie correspond à
la valeur que vous obtenez par défaut à partir de l' outil de ligne de
commande md5 .
Débogueur
Node.js a des fonctionnalités étendues pour le débogage des applications.
La particularité de ce débogueur est que vous pouvez utiliser le débogueur à
la fois localement sur l'ordinateur sur lequel vous exécutez votre application
Node.js et via une connexion TCP depuis un ordinateur distant. Cette
fonctionnalité permet de faire fonctionner le débogueur depuis la ligne de
commande avec une série de commandes. Une autre variante de la façon
dont vous pouvez utiliser le débogueur est de le contrôler via votre
environnement de développement . Pour le débogueur Node.js, il existe des
plugins pour Eclipse, Webstorm et d'autres environnements de
développement.
Datagramme
En plus de la communication via des sockets TCP ou des fichiers de
sockets, qui est effectuée par le module Net , la communication peut
également être effectuée à l'aide du protocole UDP. La différence est que
UDP est un protocole très léger, non orienté connexion. Vous ne pouvez pas
utiliser ce protocole pour vous assurer qu'il n'y a pas de perte de données
sur la connexion entre le serveur et le client. Une connexion UDP est
principalement utilisée pour les données en temps réel non critiques, dans
lesquelles la perte de certains paquets de données n'a aucun effet négatif sur
l'application.
DNS
Lors du développement d'applications Web, il est souvent nécessaire de
communiquer avec d'autres systèmes. La communication au niveau du
protocole a lieu avec un adressage unique via une combinaison d'adresse IP
et
Numéro de port à la place. Dans la plupart des cas, cependant, il est plus
judicieux dans une application d'utiliser des noms d'hôte plutôt que des
adresses, car les adresses attribuées dynamiquement peuvent changer
fréquemment, mais le nom d'hôte reste le même dans la plupart des cas. Le
système de noms de domaine, ou DNS en abrégé, se charge de la résolution
des noms d'hôte en adresses IP. Node.js dispose d'un module spécialisé dans
la résolution de noms. Ce module gère non seulement la résolution des
noms d'hôte, mais peut également lire différents types d'enregistrements de
données à partir d'un domaine, tels que les enregistrements MX pour
l'adresse du serveur de messagerie. Dans la liste, vous pouvez voir comment
vous pouvez utiliser Node.js pour résoudre l'adresse d'un domaine.
var dns = require ('dns');
dns.resolve ('www.google.de', function (err, addrs) {
addrs.forEach (function (record) {
console.log ('www.google.de is' + record);});
});
domaine
Le module Domaine est utilisé pour résumer les erreurs qui se produisent
lors de l'utilisation d' EventEmitters . Cette fonctionnalité n'est que depuis
la version 0.8 de Node.jsBestandteil la plate-forme et est actuellement
encore une fonctionnalité expérimentale d'aide geführt.Die fonctionnalité de
ce module sur le point d'attraper toutes les erreurs dans une section
spécifique dans une application et d'empêcher ainsi l'application se termine.
Le listing 4.8 illustre cela.
ar fs = require ('fs'),
domain = require ('domain'),
emitter = new (require ('events' ) .EventEmitter ) ();
var fsDomain = domain.create ();
fsDomain.on ('error', function (err) {
console.log ( 'An error occured in Domain');
console.log (err);
});
fsDomain.run ( function () {
fs.readFile ('/ tmp / doesNotExist', function (err, data) {
if (err) {throw err;
}
console.log (data);
});
});
fsDomain.run ( function ( ) {
emitter.emit ('error', {message: 'EventEmitter error Event emitted'})
;});
Événements
Node.js est basé sur une architecture qui prend en charge le développement
événementiel. L'utilisation de la boucle d'événements seule garantit que les
opérations d'E / S sont externalisées à partir du thread d'application central.
Le module Events fournit une classe EventEmitter , qui doit servir de base
à tous les objets pouvant déclencher des événements. Le serveur du module
http , par exemple, hérite de la classe EventEmitter afin d'assurer la bonne
gestion des événements. Dans le cas d'une connexion entrante, la demande
d' événement est déclenchée, à laquelle est liée la fonction RequestListener
, qui a été définie lors de la création du serveur. Un exemple très simple qui
illustre l' utilisation de la classe EventEmitter est présenté dans la liste.
var myEvent = new (require ('events' ) .EventEmitter ) ();
myEvent.on ('event', function (data) {
console.log (data);
});
myEvent.emit ('event', 'Hello World');
Système de fichiers
Le module FileSystem est un module très important de la plateforme
Node.js. Il contrôle tous les accès, en lecture et en écriture, au système de
fichiers. Vous avez déjà vu l'utilisation de ce module au début de ce chapitre
dans l'extrait 4.1. Contrairement au module DNS , dans lequel toutes les
méthodes ne fonctionnent que de manière asynchrone, c'est-à-dire avec
rappel, le module FileSystem a une contrepartie synchrone pour chaque
opération asynchrone. Dans le cas d'une opération synchrone, la méthode
est juste un appel avec une certaine valeur de retour. Il n'est pas nécessaire
de définir ici une fonction de rappel, le contexte de la fonction courante
n'est pas laissé et le script s'exécute de manière synchrone, instruction par
instruction. Il convient toutefois de noter que les opérations du système de
fichiers bloquent l'exécution du script dans ce cas. Cela signifie que
l'instruction suivante ne peut pas être exécutée tant que l'opération du
système de fichiers n'est pas terminée. Pour plus d'informations sur
l'utilisation du module FileSystem , reportez-vous au chapitre 5,
«Utilisation des fichiers», qui traite uniquement de cette rubrique.
HTTP
Le serveur Web classique dans Node.js est le module http disponible Le
module gestellt.Dieses, cependant, offre non seulement le composant
serveur, mais vous pouvez également l'utiliser pour créer un client HTTP et
interroger le serveur Web. Dans l'exemple d'introduction du chapitre 3, "Un
premier exemple", le composant serveur a déjà été examiné en détail. Le
chapitre 6, "Communication", traite en détail des options de communication
de Node.js et ici, entre autres, des fonctionnalités du module http .
HTTPS
Le module https va également dans une direction similaire au module
crypto . Il garantit que les données confidentielles sont cryptées et
déplacées entre le client et le serveur. L'implémentation sécurisée de HTTP
dans Node.js est un module distinct qui dérive de parties du module TLS
et a des interfaces très similaires au module http . Le module https est
également examiné plus en détail au chapitre 6 et ses utilisations possibles
sont illustrées à l'aide d'exemples spécifiques. Modules Le système de
modules Node.js lui-même est également implémenté en tant que module. Il
permet de définir les modules et de les charger. Des fonctions d'aide
supplémentaires sont également disponibles. La fonctionnalité du module
est d'une grande importance dans les applications Node.js, car elle permet
de subdiviser le code source d'une application en parties plus petites et de
rendre une application plus maintenable. Vous avez utilisé le système de
modules à plusieurs reprises au cours de ce livre. Chaque appel à la
fonction require représente une utilisation du module Module. Au cours
de ce chapitre, vous en apprendrez plus sur ce module, ses interfaces et
comment vous pouvez utiliser cette fonctionnalité pour votre propre
application.
Net
La communication est un sujet important dans les applications Web
modernes. Ceux-ci consistent souvent en plusieurs systèmes qui doivent
échanger des informations entre eux. L'éventail des types et protocoles de
communication est large. Le module Net vous offre un certain nombre
d'interfaces avec lesquelles vous pouvez communiquer via des connexions
TCP et des sockets UNIX, dans le rôle de serveur et de client. Dans le
chapitre 6, vous apprendrez comment utiliser ce module pour envoyer des
données sur le réseau ou localement entre différents processus.
Os
Ce qu'est le navigateur pour JavaScript côté client est le système
d'exploitation pour JavaScript côté serveur. D'abord et avant tout un
environnement qui offre un certain nombre d'interfaces avec lesquelles vous
pouvez interagir. Comme dans le navigateur, il existe certaines différences
entre les différents systèmes d'exploitation et architectures informatiques
qui peuvent influencer le développement des applications. Le module OS
vous permet d'interroger certains paramètres de structure du système
d'exploitation, tels que le nom d'hôte ou le type et la version du système,
puis d'influencer l'exécution de l'application. Au cours de ce chapitre, vous
en apprendrez plus sur ce module et verrez comment les différentes
fonctionnalités fonctionnent à l'aide d'exemples pratiques. Path Node.js est
relativement indépendant du système d'exploitation sous-jacent. Cependant,
cela ne s'applique qu'à certaines limites. Les différences entre les systèmes
UNIX et Windows sont particulièrement visibles dans le domaine de l'accès
au système de fichiers. Le module Path est disponible pour vous aider à
résoudre ce problème et d'autres problèmes de formulation et d'analyse des
noms de chemin. Cela vous permet également de gérer plus facilement les
chemins absolus et relatifs. Dans la Section 4.2, «Modules de base», vous
apprendrez à utiliser les chemins dans les applications Node.js à l'aide de
divers exemples.
Punycode Punycode est utilisé pour convertir des chaînes Unicode au
format ASCII, et Punycode peut être utilisé dans les deux sens, c'est-à-dire
à la fois d'Unicode à ASCII et d'ASCII à Unicode. Punycode est né de la
nécessité d'autoriser les noms de domaine avec des caractères spéciaux, qui,
en revanche, n'autorisent pas le DNS. Punycode a créé une solution de
contournement qui rend cela possible. Node.js s'appuie sur un convertisseur
Punycode réellement indépendant, qui fait partie intégrante du système de
modules Node.js depuis la version 0.6.2. Les caractéristiques les plus
importantes de ce module sont les différentes méthodes d'encodage et de
décodage des chaînes. Le Listing 4.10 montre l'utilisation des deux
variantes.
var punycode = require ('punycode'),
decoded = ' ', encoded = '-mfb6xb1226bstb4a3n9oaf';
console.log ( punycode.encode (decoded));
console.log ( punycode.decode (encoded));
Chaîne de requête
Les sites Web sont adressés via leur URL. En plus de diverses informations
telles que le nom d'hôte et le numéro de port, HTTP permet également la
spécification d'une soi-disant chaîne de requête. Ceci est normalement
utilisé pour transmettre les paramètres au serveur. La chaîne de requête se
trouve ci-dessous dans le chemin de l'URL et en est séparée par un point
d'interrogation. La chaîne de requête se compose de paires clé-valeur
séparées les unes des autres par des caractères & . Les clés et les valeurs
sont séparées les unes des autres par des signes = . La gestion des chaînes
de requête, qu'il s'agisse de codage ou de décodage, est une tâche
fréquemment récurrente qui est considérablement simplifiée par le module
QueryString .
var querystring = require ('querystring'),
string = 'search = nodejs & page = 1',
obj = {search: "nodejs", page: "1"};
console.log ( querystring.stringify (obj));
console.log ( querystring.parse (string));
La liste montre l'utilisation de la méthode stringify , qui peut être utilisée
pour convertir un objet en chaîne de requête. Les paires clé-valeur sont
formées et connectées avec des caractères & . La méthode d' analyse est
utilisée pour traduire une chaîne de requête en une structure d'objet que
vous pouvez continuer à utiliser dans votre application et dans laquelle vous
pouvez accéder aux différents composants de la chaîne de requête à l'aide
des valeurs de clé. Avec les deux méthodes, vous pouvez transférer le
séparateur dans les paires clé-valeur ainsi que le séparateur entre les paires
clé-valeur individuelles et ainsi écraser les normes. Un problème persiste
lors de l'analyse des QueryStrings. Une chaîne de requête fait généralement
partie d'une URL entière, vous devez l'extraire en tant que telle avant de
pouvoir utiliser le module QueryString pour la traiter davantage. Node.js
vous propose une combinaison du module URL et du module QueryString
. La méthode d' analyse du module URL accepte un deuxième argument
facultatif, qui garantit que la méthode d' analyse du module QueryString
est appelée afin d'analyser la chaîne de requête d'une URL dans le même
appel de fonction et de la renvoyer sous forme de tableau dans le retour
valeur .
Readline
Avec Node.js, vous pouvez non seulement implémenter des applications
Web, mais également des applications qui fonctionnent sur un serveur
indépendamment des clients du navigateur. Dans de tels cas, cependant, il
est parfois nécessaire de fournir une interface avec laquelle un utilisateur
peut également contrôler ces types d'applications. Il existe deux principaux
canaux de communication disponibles sur la ligne de commande: l'entrée et
la sortie standard. Vous pouvez l'utiliser pour accepter l'entrée de
l'utilisateur ou pour afficher des informations à l'utilisateur. Les outils de
ligne de commande écrits en Node.js peuvent également être utilisés dans le
domaine des applications Web. C'est notamment le cas de l'installation et de
la configuration.
var readline = require ('readline'),
rl = readline.createInterface ({
input: process.stdin ,
output: process.stdout });
rl.write ('*** Node.js command line *** \ n');
rl.question ('$>', function (command) {
rl.write (command + '\ n'); rl.close ();}
);
Minuteries
Comme vous l'avez déjà vu avec la fonctionnalité de la console , certaines
fonctionnalités déjà connues de l'environnement du navigateur ont été
portées sur Node.js. Cela s'applique également aux fonctions dépendant du
temps qui contrôlent les délais et les intervalles. Tout d'abord, vous
apprendrez à connaître la fonctionnalité de délai d'expiration à l'aide d'un
court exemple. Le Listing 4.15 montre comment vous pouvez utiliser les
fonctions correspondantes.
var callback = function (string) {
console.log ( 'Hello' + string);
}
var timeout = setTimeout ( callback, 5000, 'World');
// clearTimeout (timeout);
TLS
Le module TLS est un outil que vous pouvez utiliser pour utiliser des
connexions cryptées pour le transfert de données. Le module TLS est basé
sur d'autres modules que vous avez déjà brièvement connus. D'une part, le
Crypto module est utilisé pour des tâches de cryptage, le flux module
fournit les interfaces pour les flux de données, et le net module forme la
base d'une structure de serveur sécurisé. TTY Vous pouvez déjà voir
l'utilisation du module TTY au cours de ce chapitre à l'aide d'exemples. Ce
module fournit des flux lisibles et inscriptibles pour les terminaux. Cela
signifie que vous obtenez un contact indirect avec ce module lorsque vous
utilisez le REPL. Vous utiliserez rarement ce module directement. En
pratique, cela signifie que process.stdin , l' entrée standard et
process.stdout , la sortie standard , sont des flux du module TTY . Vous
pouvez facilement savoir si les deux variables proviennent vraiment de ce
module en exécutant le code de Listing.
$ node
> process.stdout .isTTY
True
> process.stdin .isTTYtrue
>
URL
Le module URL a déjà été mentionné et a déjà été utilisé dans certains
exemples. Dans le cas le plus simple, vous utilisez la méthode parse pour
traduire une URL en un objet, dans lequel vous pouvez accéder aux
différentes parties de l'URL via les différentes propriétés.
var url = require ('url'),
string = 'http://www.google.de/search?q=node.js';
console.log ( url.parse (string)
);
Le résultat dans la liste est un objet, où vous entre autres, le proto-col http
, l'hôte www.google.de , le chemin d'accès / recherche ou chaîne de
requête q = node.js accéder à können.Die deuxième fonctionnalité de l'
URL - Module, la méthode de format , est utilisée pour vous donner le
chemin du retour, c'est à dire pour générer une URL valide à partir d'un
objet.
vous montre certaines des propriétés disponibles que vous pouvez utiliser
pour générer une URL valide. La troisième et dernière fonctionnalité du
module URL consiste en la méthode de résolution . Avec cela, une URL
peut être créée. Pour cela, la méthode prend deux arguments, une URL de
base et un chemin relatif. La valeur de retour se compose de l'URL
composite. La composition non seulement les chaînes sont enchaînées, mais
également certains caractères sont évalués. Par exemple, deux points
signifient qu'un niveau du chemin doit être réduit. Le Listing 4.19 illustre
cela.
Modules de base
Vous avez déjà appris que les différents modules de la plateforme Node.js
sont plus ou moins indépendants les uns des autres. Cependant, il existe
certains modules sur lesquels d'autres modules sont basés. D'autres modules
fournissent uniquement des fonctionnalités spéciales. Vous en apprendrez
plus sur ces modules de base ci-dessous.
Objets globaux
Si vous souhaitez utiliser des fonctionnalités supplémentaires sous la forme
de modules Node.js dans votre application, vous devez normalement
intégrer le module avec la fonction require . Vous pouvez accéder aux
fonctionnalités respectives via la valeur de retour de cette fonction. Certains
objets et fonctions sont si souvent nécessaires que les développeurs de
Node.js ont décidé de les rendre disponibles directement dans le contexte
global. Dans ce cas, vous n'avez pas besoin d'intégrer un module avant
utilisation. Les fonctions et objets globaux sont disponibles dans un
contexte global. Ce contexte est comparable au contexte de fenêtre du
navigateur, mais il faut noter que chaque module a son propre contexte
global. La liste suivante contient toutes les fonctions et objets globaux dans
Node.js.
Tampon
La classe Buffer est également disponible globalement, car vous avez très
souvent affaire à ce type d'objet dans Node.js. Vous pouvez voir l'utilisation
de cette fonctionnalité dans la section sur le module ZLIB de ce chapitre,
par exemple, dans laquelle la fonction gonfler reçoit une chaîne de
caractères compressée comme objet tampon pour le déballage. Un objet de
cette classe peut être créé facilement et il n'est pas nécessaire de charger le
module tampon au préalable. console Une autre fonctionnalité que vous
connaissez déjà à partir du JavaScript côté client grâce à laquelle vous en
apprenez déjà plus dans ce chapitre objet global est disponible, également
appelée. Nous parlons de l' objet console , qui est principalement utilisé
pour la sortie sur la ligne de commande et pour mesurer les temps
d'exécution lors du développement.
Exportations
La création de vos propres modules est également très courante lorsque
vous travaillez avec Node.js, pour lequel Node.js vous fournit l' objet
exports . Cependant, cet objet n'existe pas dans le contexte global. Il existe
un objet Exportations distinct pour chaque module que vous créez. Il est
utilisé pour rendre la fonctionnalité d'un module accessible à l'extérieur. L'
objet exports fait partie du module Modules et est complètement nommé
module.exports , où les deux notations ont la même fonctionnalité. La liste
montre l'utilisation de l' objet exports sous la forme d'un validateur d'e-
mail, que vous pouvez enregistrer, par exemple, dans le fichier validator.js.
Vous pouvez utiliser cette fonction dans votre application en tapant la ligne
require ('validator.js'). Courriel ('[email protected]'); intégrer dans votre
application. Il est vérifié si la chaîne [email protected] contient une adresse e-
mail valide.
exports.email = function (email) {
var regex = / ^ ([a-z0-9_ \ .- ] +) @ ([\ da-z \ .-] +) \. ([az \.] {2,6}) $ /,
result = regex.exec (email);
if (result) {
return true;
}
return false;
};
Processus
Lors du développement d'applications, les informations du processus
Node.js actuel sont souvent consultées. Pour cette raison, le module
Process - qui fournit simplement ces informations est également disponible
dans le monde entier. De la même manière, les méthodes de ce module
peuvent être utilisées pour contrôler le processus. De plus amples
informations sur l'utilisation des fonctionnalités de ce module sont
disponibles plus loin dans ce chapitre. Vous pouvez utiliser le chargeur de
module Node.js principalement en utilisant la fonctionnalité requise . Ceci
est également disponible dans le monde entier. Dans les sections suivantes,
vous en apprendrez plus sur la façon dont vous pouvez charger des
modules, mais aussi comment vous pouvez influencer le comportement du
chargeur de module. Les fonctions de temporisation et d' intervalle déjà
décrites sont utilisées assez souvent. Pour cette raison, comme dans le
navigateur, elles sont disponibles sous forme de fonctions globales.
Utilitaire
Le module utilitaire contient de nombreuses méthodes utiles que vous
pouvez utiliser lors du développement de votre application. Une fonction
qui manque à de nombreux développeurs qui viennent d'autres langages de
programmation est la fonction connue de C, printf . Le module utilitaire
vous offre une fonctionnalité similaire avec la fonction de formatage .
Votre utilisation démontre votre annonce.
var util = require ('util'),
string = util.format ('Hello% s', 'World');
util.log (string);
Événements
Au cours de ce chapitre, vous avez déjà un bref aperçu du module
Evénements . Étant donné que la plate-forme Node.js s'appuie souvent sur
des événements lors de la communication entre objets, il est logique
d'utiliser cette forme d'architecture lors de l'implémentation de vos propres
fonctionnalités. En plus de la simple utilisation du module Evénements ,
comme vous pouvez le voir dans le Listing 4.9, il existe d'autres méthodes
que vous pouvez utiliser pour mieux contrôler les événements et leur
gestion. Up-elle vous avez seulement l'utilisation des méthodes émettent
pour la mise Eventsund sur vu pour réagir aux événements. La première
méthode garantit qu'une fonction de rappel enregistre et émet est appelée
chaque fois que l'événement spécifié est déclenché. Avec la méthode once ,
vous avez la possibilité d'exécuter la fonction de rappel uniquement la
première fois que l'événement est déclenché. Vous pouvez également
supprimer des écouteurs d'événements précédemment enregistrés. Vous
pouvez le faire pour un écouteur spécial à l'aide de la méthode
removeListener ou pour tous les écouteurs d'un événement spécifique à
l'aide de removeAllListeners . La liste vous montre une combinaison de ces
méthodes. Nous utilisons également la méthode des écouteurs , que vous
pouvez utiliser pour savoir quels écouteurs sont liés à un événement
spécifique.
var emitter = new (require ('events' ) .EventEmitter ) ();
var callback = function () {
console.log ( 'Once ping event');
};
emitter.once ('ping', callback);
emitter.on ('ping', function () {console.log ('On ping event');
} ); console.log (emitter.listeners ('ping'));
mitter.removeListener ('ping', callback);
console.log ( emitter.listeners ('ping'));
OS
Le module OS est également d'une importance capitale pour votre
application. Surtout, il existe des options pour interroger les paramètres du
système d'exploitation. Vous pouvez maintenant l'utiliser pour générer un
petit aperçu des paramètres de structure de votre système dans un autre
exemple. Cet aperçu est destiné à afficher le nom d'hôte, des informations
sur le type de système d'exploitation, l'architecture de l'ordinateur et le
nombre de processeurs. De plus, la disponibilité, la mémoire de travail libre
et la charge de calcul doivent être affichées. Étant donné que ces
informations sont assez dynamiques, l'affichage doit être mis à jour à
intervalles réguliers.
}
Monitor.prototype.setFreemem = function () {
this.freemem = this.formatNumber (os.freemem () / 1048576);
}
Monitor.prototype.setLoad = function () {
this.load = this.formatNumber (os.loadavg () [0]);
}
Monitor.prototype.formatNumber = function (number) {
return Math.round (number * 100) / 100;
}
Monitor.prototype.clearScreen = function () {
for ( var i = 0; i <process.stdout.rows; i ++) {
console.log ('\ r \ n');
}
}
Monitor.prototype.update = function () {
this.setUptime ();
this.setFreemem ();
this.setLoad ();
return this;
}
Monitor.prototype.output = function () {
this.clearScreen ();
console.log ( this.hostname );
console.log ( this.sysInfo );
console.log ('Uptime:' + this.uptime );
var free = this.freemem ;
var total = this.totalmem ;
console.log ( 'Freemem:' + free + 'MB of' + total + 'MB');
console.log ( 'Load:' + this.load);
}
var sysMon = new Monitor ( );
setInterval ( function ( ) {
sysMon.update ( ) .output ()}, 500);
Processus
Lorsque le module OS vous fournit des informations au niveau du
système, l' objet Processus fonctionne à un niveau supérieur. Cet objet
forme l'interface avec le processus Node.js en cours d'exécution.
Contrairement à OS est processus pas un module Node.js à part entière
dont le code source dans lib est le répertoire de fichier Node.jsals
JavaScript est disponible, mais un objet à l' abstraction
undProzesssteuerung qui a fourni par Node.js directement disponibles
wird.Im Dans le dernier exemple , le moniteur système du Listing 4.28,
vous avez déjà utilisé l' objet de processus pour effacer l'écran. Le listing
4.29 montre cette partie du code source.
var clearScreen = function () {
for ( var i = 0; i <process.stdout.rows; i ++) {
console.log ('\ r \ n');
}
}
L'exemple du Listing 4.32 vous montre deux cas dans lesquels vous devez
utiliser l' objet process . D'une part, il s'agit de la méthode kill déjà
mentionnée pour envoyer un signal à un processus, et d'autre part, de la
propriété pid de l' objet process , qui contient l'ID du processus Node.js
actuel auquel vous font référence dans ce cas veulent envoyer le signal. En
supposant que l'exemple de processus ne peut plus être terminé par
SIGTERM , dans ce cas, vous avez besoin de SIGKILL comme signal qui
ne peut pas être intercepté par le processus lui-même, mais qui est à la place
envoyé directement au noyau, qui se charge de terminer le processus.
Cependant, cela signifie également que le processus n'a pas d'autre option
pour conserver les données qu'il peut avoir en mémoire sur le disque dur.
Semblable à la fin avec la méthode abort , le système définit
automatiquement une valeur de retour de 137 lorsque le kill avec
SIGKILL se produit et la chaîne Killed: 9 est sortie. Le nombre 9 représente
la représentation entière de SIGKILL et 15 celle de SIGTERM . L'
objet de processus est assez vaste si l'on considère sa gamme de fonctions.
En plus des propriétés déjà présentées, que vous pouvez utiliser pour
accéder à l'entrée et à la sortie ou à l'ID de processus, argv et env sont
deux structures de données très précieuses qui sont très susceptibles d'être
utilisées dans le développement d'outils de ligne de commande. La propriété
argv vous propose un tableau JavaScript dans lequel les différentes parties
de l'appel de ligne de commande de l'application actuelle sont stockées. En
supposant que vous démarrez votre application avec la ligne de commande
nodeserver.js - env = debug , argv contient trois éléments. Le premier est la
commande de noeud elle-même, le second est le chemin absolu et le nom
du fichier JavaScript, et le troisième élément est l'option spécifiée --env =
debug . De cette façon, vous pouvez rendre votre application configurable
à l'aide des options de ligne de commande. env fournit, comme son nom
l'indique, les variables d'environnement du processus Node.js actuel. Les
informations incluent, par exemple, le nom de l'utilisateur, la variable PATH
ou le répertoire personnel de l'utilisateur. L' objet de processus vous donne
également la possibilité d'afficher la version de Node.js lui-même et
certaines bibliothèques centrales. Vous pouvez obtenir les informations de
version exactes de Node.js via process.version . En plus de la version de
Node.js, process.ver-sions vous donne également les informations
pertinentes sur http_parser, le moteur V8, Ares, libuv, zlib et openssl.
Cependant, l' objet de processus vous permet non seulement de lire des
informations ou le processus, mais également d'affecter le processus en
cours d'exécution. Notez que les méthodes suivantes ne sont pas disponibles
sous Windows. Il est possible d'utiliser process.setuid pour changer
l'utilisateur sous lequel le processus en cours s'exécute. Cependant, pour
changer d'utilisateur, vous avez besoin de l'autorisation pour changer
d'utilisateur, sinon vous recevrez un message d'erreur. Vous pouvez obtenir
l'ID utilisateur actuellement défini à l'aide de la méthode process.getuid . La
même chose que pour l'ID utilisateur s'applique également à l'ID de groupe
avec les méthodes pro-cess.setgid et process.getgid .
Tampon
Le module tampon est que vous avez déjà rencontré plusieurs fois au cours
de ce livre. Il est utilisé à la fois lors de la lecture de fichiers, mais peut
également être utilisé pour écrire des données dans un fichier. Lorsque les
données doivent être empaquetées avec le module ZLIB , les objets Buffer
sont utilisés pour encapsuler les données dans des flux d'octets et pour les
utiliser en relation avec des flux de données. Un objet tampon a plusieurs
caractéristiques importantes: Le tampon a une taille fixe et ne peut pas être
modifié après sa création. Le codage des caractères des données contenues
peut également être spécifié. Vous disposez de plusieurs options pour créer
un objet tampon. Un objet tampon est créé à l' aide de certaines méthodes
telles que fs.readFile . Cependant, vous pouvez également créer un tel objet
explicitement en utilisant le constructeur de la classe Buffer . Un nombre
peut être passé au constructeur. Cela générera un tampon vide avec le
nombre d'octets spécifié. Une autre façon de le créer est de passer un
tableau d'octets au constructeur qui composent le contenu de l'objet tampon.
La troisième et dernière option consiste à spécifier une chaîne de caractères
et un codage facultatif.
var myBuffer = new Buffer ('Hello World'),
yourBuffer = new Buffer (11);
myBuffer.write ('World Hello World');
var length = myBuffer.length;
console.log (myBuffer.toString ());
myBuffer.copy (votreBuffer);
console.log (Buffer.concat ([myBuffer, yourBuffer]). toString ());
Chemin
Le dernier module que vous apprendrez dans cette section est le module
Path . Comme déjà annoncé, vous allez maintenant traiter de certaines
fonctionnalités de ce module et voir quelques exemples de la façon dont
vous pouvez l'intégrer dans une application Node.js et l'utiliser là-bas. Une
spécification de chemin dans le système d'exploitation est généralement une
séquence de plusieurs noms de répertoire séparés les uns des autres par le
séparateur de chemin du système d'exploitation. En plus des noms de
répertoires normaux, cependant, aussi . et .. répertoires valides. Un seul
point fait référence au répertoire courant, deux points indiquent le répertoire
parent. Ces éléments peuvent être utilisés pour des noms de répertoires tels
que /tmp/./. /./ .. / tmp plomb. Le module Path vous propose la méthode de
normalisation pour rendre ces détails de chemin plus clairs. Le Listing 4.34
vous montre le résultat de la normalisation.
$ node
> require ('chemin') .normalize ('/tmp/./././../tmp');
'/ tmp'
Dans le cas de la méthode join , Node.js fait un peu de travail pour vous,
par exemple les fragments de chemin individuels sont automatiquement
séparés les uns des autres par un séparateur de chemin. La normalisation du
chemin garantit également qu'il n'y a pas de séparateurs de chemin en
double ou inutiles dans le chemin global. Une autre aide à la navigation est
la méthode de résolution , qui peut être utilisée pour convertir une cible en
un chemin absolu. Pour ce faire, vous spécifiez un chemin initial et une
série de commandes pour naviguer vers la destination, et la méthode
retourne ensuite le chemin résultant. La méthode relative vous donne les
commandes avec lesquelles vous pouvez passer d'un chemin absolu à un
autre. Donc, si vous entrez les deux chemins / home et / tmp, vous obtenez
le résultat ../tmp. Les méthodes dirname , basename et extname sont utiles
lorsque vous travaillez avec des chemins et des fichiers. Ils acceptent
chacun une chaîne comme argument, qui décrit un chemin vers un fichier,
et renvoient le chemin sans le nom du fichier, uniquement le nom du fichier
sans le chemin ou uniquement l'extension de fichier. Dans les dernières
sections, vous avez reçu une brève introduction à certains modules
importants de Node.js que vous rencontrerez encore et encore lors du
développement d'applications pour la plate-forme Node.js et avec l'aide
desquels vous pouvez résoudre un certain nombre de problèmes standard
avec peu d'effort . Dans la section suivante, vous allez maintenant aborder
la question de savoir comment concevoir et structurer votre propre code
afin qu'il reste aussi maintenable et flexible que possible.
La méthode toString du Listing 4:40 ne prend aucun argument, car elle fera
en sorte que la propriété Wertaus numSecs lit l'objet. En interne, la méthode
toString appelle d'abord la méthode CalculateParts et transmet la valeur de
retour reçue à la méthode padParts . Le résultat est finalement joint et
renvoyé à l'aide de la méthode join avec les deux points comme séparateur.
Maintenant que vous assemblez les différentes parties, vous obtenez une
classe à l'aide de laquelle il est possible de générer une chaîne de caractères
formatée à partir d'un certain nombre de secondes. Une fois que vous avez
implémenté la classe SecondsFormatter , il n'y a que quelques lignes de
code entre vous et la solution de la tâche.
if ( process.argv .length! == 4) {
throw new error ( 'Usage: node tracker.js <from> <to>');
}
Le module Modules
Les deux composants les plus importants du module Modules , à savoir le
chargeur de module de Node.js, sont d'une part l' objet exports , que vous
utilisez pour publier les modules, et d'autre part la méthode require , avec
laquelle vous pouvez intégrer le module. En plus de ces deux
fonctionnalités de base, ce module vous offre un certain nombre d'autres
fonctionnalités qui peuvent être très utiles dans le développement et le
fonctionnement des modules. Pour cela, la plateforme Node.js vous fournit
l' objet module globalement, vous n'avez donc pas à le rendre disponible
via la méthode require . Dans un module, vous pouvez accéder à un certain
nombre de propriétés du module Module, avec lesquelles vous pouvez
interroger diverses informations sur le module actuel. Tout d'abord appelé
les propriétés module.id et module.filename . Ces deux propriétés
indiquent généralement le nom de fichier absolu du module. Si vous
souhaitez construire sur ces informations, vous devez utiliser la deuxième
option pour module.filename . La propriété module.id contient la valeur »
. «Si vous y accédez en dehors d'un module, par exemple dans le fichier
principal de votre application. Vous pouvez également accéder à ces deux
propriétés de l' objet module dans Node.js REPL. Dans ce cas, la propriété
id a la valeur repl et le nom de fichier se compose du chemin actuel et a le
nom de fichier repl. Vous pouvez utiliser la propriété chargée de l' objet
module pour savoir si le module actuel est déjà chargé. Dans ce cas, la
valeur est vraie . Si le module actuel n'a pas encore été chargé ou est
toujours en cours de chargement, la valeur de cette propriété est false. Si
une application Node.js est lancée, la propriété require.main est
automatiquement renseignée avec l' objet module du fichier d'entrée. Cela
signifie que vous pouvez accéder au nom de fichier du fichier, qui sert de
point d'entrée à votre application, dans chaque module via require.main
.filename . Le module modules s'arrête à côté de cette information, les
données sur le front des rela-relations entre les modules, de sorte que le
module par lequel les autres nous re-dener a été chargé ou quels modules à
travers un module particulier. La propriété parent de l' objet module vous
fournit des informations sur le module qui a chargé le module actuel. Ces
informations se présentent sous la forme d'un objet module . Cela signifie
que, entre autres, vous avez accès aux propriétés d' id ou de nom de
fichier du module parent . La propriété children contient un tableau de
modules que le module actuel doit charger. Cependant, cela ne s'applique
qu'à vos propres modules. Les modules fournis par la plate-forme Node.js
elle-même ne sont pas répertoriés dans le tableau des enfants . Les objets
de cette structure de données ont la même structure que l' objet parent .
Le chargeur de module
Les modules sont intégrés en utilisant la méthode requise . Pour cela,
comme vous pouvez le voir dans l'exemple du Listing 4.44, vous passez le
nom du fichier qui contient le code source du module à charger. Vous
pouvez spécifier le nom du fichier à la fois de manière absolue et relative au
fichier actuel.
$ ls / srv / node / wordCount
WordCount.js app.js
node_modules
Donne envie de charger le module, ni / ni . / à l' avance, le chargeur de
module charge soit un module interne de la plateforme Node.js, soit
recherche dans le répertoire node_modules un module avec le nom
correspondant. Le lanceur de module lance la recherche dans le répertoire
node_modules du répertoire courant. Si le module n'y est pas trouvé, une
tentative est faite un niveau supérieur pour trouver le module. Dans la
structure de répertoires du Listing 4.45, cela signifie que le répertoire / srv /
node / wordCount / node_modules est recherché en premier, puis dans / srv
/ node / node_modules et ainsi de suite jusqu'à ce que le chargeur de
module arrive dans le répertoire racine. Si le module n'est pas trouvé dans
cette structure de répertoires, le chargeur de module recherche dans les
répertoires spécifiés dans la variable d'environnement NODE_PATH . De
plus, les répertoires <home> /.node _modules, <home> /.node_libraries et
<install-prefix> / lib / node sont recherchés. Lors du chargement de
modules à l'aide de la méthode require , le chargeur de module recherche
non seulement le fichier spécifié, mais également le nom du fichier si
aucune extension de fichier n'est spécifiée et ajoute les extensions .js, .json
et .node. Ce type de recherche de modules vous permet d'installer
différentes versions de modules Node.js sur votre système et de contrôler la
version que le chargeur de module doit charger en plaçant les modules
respectifs. De cette manière, vous pouvez éviter les conflits de version qui
résultent du fait qu'une autre application ou bibliothèque nécessite une
version différente d'un module. Selon l'endroit où vous enregistrez les
modules, vous pouvez influencer la vitesse du processus de chargement.
Les modules qui sont stockés dans le répertoire local node_modules sont
chargés le plus rapidement car un processus de recherche fastidieux est
évité. La liste suivante résume brièvement les répertoires dans lesquels les
modules sont recherchés dans l'exemple ./srv/node/wordCount/
node_modules / srv / node / node_modules / srv / node_modules /
node_modules / home / sspringer / .node_modules / home / sspringer /.
node_libraries / usr / local / lib / node_modules La variable
d'environnement NODE_PATH est vide sur ce système, donc aucun chemin
supplémentaire n'est ajouté. Avec le chargeur de modules de Node.js, il
existe un autre moyen d'intégrer des modules dans votre application. Au
lieu du nom d'un module, vous pouvez également spécifier un répertoire
entier. La raison en est que les bibliothèques sont souvent stockées dans
leurs propres structures de répertoires. Il existe une convention de
dénomination définie pour ces modules, la façon dont les fichiers doivent
être nommés afin que le chargeur de module puisse trouver le code source
et l'intégrer correctement. Si vous donnez au chargeur de module un
répertoire au lieu d'un nom de fichier, la première étape consiste à essayer le
fichier avec le nom package. pour trouver json. Vous rencontrerez à
nouveau ce fichier au cours de ce chapitre en ce qui concerne le Package
Manager de la plateforme Node.js et ses modules. Beaucoup de choses
doivent être dites à l'avance ici: Ce fichier concerne la configuration et la
description interne des modules. Vous pouvez utiliser ce fichier pour faire
référence au point d'entrée d'un module dans un répertoire. Pour illustrer ce
cas, adaptez un peu l'exemple avec le compteur de mots. Vous devez
d'abord créer un répertoire appelé WordCount. Celui-ci contiendra plus tard
votre module. Copiez ensuite le fichier WordCount.js, qui contient le code
source du module, dans un sous-répertoire lib de ce répertoire. Créez
ensuite un fichier appelé package.json dans le répertoire WordCount. Le
contenu de ce fichier correspond au code source de Listing.
{
"nom": "WordCount", "main": "./lib/WordCount.js"
}
Vous devez effectuer le dernier ajustement dans app.js, c'est-à-dire dans le
point d'entrée de l'application. Il ne vous reste plus qu'à vous assurer que le
module WordCount est intégré à l'aide de la commande varstats = require
('./ WordCount') . Si vous spécifiez un répertoire lorsque vous souhaitez
charger un module et qu'il n'a pas de fichier package.json, le chargeur de
module recherche alternativement les fichiers index.js et index.node comme
point d'entrée dans le module. Au sein de votre application, vous avez la
possibilité non seulement de charger un module une fois au début d'un
fichier de code source ou seulement dans un seul fichier, mais vous pouvez
le charger aussi souvent que vous le souhaitez et à divers endroits, et donc
plusieurs fois. Pour que ces modules n'aient pas à être lus plusieurs fois, le
chargeur de module effectue une optimisation en mettant en cache le
module. Cela signifie que le module n'a besoin d'être chargé et exécuté que
la première fois. Les appels restants à demander avec le nom du module
sont ensuite servis à partir du cache. La conséquence de cette fonctionnalité
est que le code source n'est exécuté que sur le premier require . Si vous
souhaitez obtenir un effet secondaire à chaque appel, vous devez le forcer
via des fonctions. Dans le Listing 4.47 et le Listing 4.48, vous pouvez voir
comment ce comportement peut être simulé.
myModule.js
console.log ('monModule appelé');
app.js
require ('./ myModule.js');
require ('./ myModule.js');
La fonctionnalité requise
Le chargeur de module de Node.js est relativement simple. Néanmoins, il
peut être difficile de suivre les applications avec de nombreux modules. La
gestion de différentes versions de certains modules sur un système est
également difficile. Le mécanisme de mise en cache du chargeur de module
peut également être un problème. En plus des fonctionnalités du système de
modules Node.js présentées jusqu'à présent, il existe d'autres fonctionnalités
qui peuvent faciliter votre manipulation des modules. Avec la méthode de
résolution de l' objet require , vous pouvez trouver dans quel fichier se
trouve un module particulier. Pour cela, il vous suffit de donner à la
méthode les informations sur le module que vous voulez charger. Le
schéma de dénomination est le même que celui utilisé dans les opérations
de chargement normales. La méthode de résolution effectue également les
mêmes opérations de recherche que l' exigence réelle , à la différence que
le module n'est pas chargé, mais que le chemin absolu du fichier dans lequel
se trouve le module est renvoyé sous forme de chaîne. Pour les modules
internes, résoudre ne renvoie que le nom du module. Cette fonctionnalité
n'est pas seulement disponible dans les applications, mais également dans
Node.js REPL. Vous avez déjà appris à connaître le cache du module de
Node.js. L' objet require vous fournit avec l' objet cache un moyen de lire
et de modifier ce cache. La propriété cache de l' objet require est une carte
de hachage, c'est-à-dire un objet JavaScript dans lequel les données sont
stockées à l'aide d'un magasin clé-valeur. Les clés sont constituées des noms
de fichiers absolus des modules respectifs, la valeur est l' objet module du
module. L' objet cache vous offre la possibilité de vérifier si un module a
déjà été chargé dans votre application. Un point important à noter,
cependant, est qu'aucun module Node.js interne n'est répertorié dans le
cache. Dans l'exemple du cache de module dans Listing, vous avez vu qu'un
module n'est évalué qu'une seule fois et est exploité à partir du cache la
deuxième fois. Vous pouvez utiliser l' objet cache pour influencer ce
comportement.
require ('./ myModule.js');
supprimer (require.cache [require.resolve ('./ myModule.js')]);
require ('./ myModule.js');
Vous avez besoin de deux conditions pour terminer la tâche. D'une part,
vous implémentez la fonction in_array , qui vérifie si une valeur est
présente dans un tableau, d'autre part, un tableau avec des valeurs valides
pour les différents modes de l'application. Le cœur de ce module est
constitué d'une fonction que vous exportez dans la propriété
exports.getData et rendez ainsi disponible. Pour accéder aux différentes
options, utilisez l' objet process et plus particulièrement la propriété argv .
Les options individuelles sont validées selon certaines règles. Ainsi, un
utilisateur ne peut choisir que l'un des trois modes. Avec le démarrage de
l'état et les statistiques , d'autres options sont également importées. Vous
enregistrez les résultats dans un objet qui est renvoyé à la fin de la fonction.
L'étape suivante consiste à intégrer le module, comme vous pouvez le voir
dans l'extrait 4.54, dans le fichier index.js, le point d'entrée central de
l'application.
var getData = require ('./ lib / getData.js');
console.log (getData.getData ());
NPM
Le Node Package Manager, ou NPM en abrégé, vous offre, en tant que
développeur d'applications JavaScript côté serveur basées sur la plate-forme
Node.js, un moyen de créer des modules et de les mettre à la disposition
d'autres développeurs. Vous pouvez également utiliser les modules
développés par d'autres programmeurs dans votre application. Le site Web
du NPM est https://npmjs.org/. En plus de diverses ressources telles que des
listes de modules, vous trouverez également une documentation détaillée du
NPM et toutes les options disponibles. Le NPM a été développé à l'origine
par Isaac Schlueter indépendamment de la plate-forme Node.js; depuis la
version 0.6.3 de Node.js, le NPM a été intégré directement dans la
plateforme et n'a plus besoin d'être installé. Cela signifie que vous pouvez
soit installer le programme d'installation .msi sous Windows, le package
.pkg sous Mac OS X ou le package binaire sous Linux, puis utiliser
immédiatement le NPM. Le NPM est utilisé sur la ligne de commande et
contrôlé via diverses options.
$ wget http://registry.npmjs.org/underscore/-/underscore-1.4.2.tgz...2012-
11-30 11:27:35 (114 Ko / s) - 'underscore-1.4.2. tgz 'enregistré
[61836/61836] $ npm install [email protected]
node_modules / underscore
L'installation crée un répertoire node_modules, comme avec l'utilisation de
l'entreprise reppmjs.org, dans lequel le code source du module est copié.
Une fois l'installation réussie, vous pouvez utiliser le module dans votre
application.
Comme dans la liste peut voir, il est dans la liste des modules de
l'arborescence umeine, vous pouvez lire directement à partir des modules
sindund installés comme des dépendances être définies entre les modules.
Vous obtenez une vue similaire après l'installation d'un module. Cependant,
cela ne contient que le module lui-même et ses dépendances, alors que
npmlist répertorie tous les modules de votre répertoire node_modules
local. L' option -g vous donne également une liste de tous les modules
installés globalement dans votre système à partir du NPM, qui affiche
également toutes les dépendances dans une arborescence.
Une fois la base de données créée et une table qui y a été créée, qui a la
même structure que le fichier journal, c'est-à-dire des champs pour la date,
l'heure de début et de fin, la différence entre les deux et un champ de texte
libre pour la tâche , vous pouvez choisir L'étape suivante consiste à
installer le module mysql à l'aide du NPM, ce qui vous donne la possibilité
d'accéder à la base de données depuis votre application Node.js. Pour
installer le module, il vous suffit d'émettre la commande npminstallmysql
dans le répertoire racine de l'application de suivi du temps. Vous avez déjà
vu les différentes étapes de l'installation dans l'extrait 4.68. Comme prévu,
vous devez effectuer les modifications les plus importantes au niveau de l'
enregistrement et de la lecture des données, sur le module persister .
Ensuite, vous convertirez progressivement ce module. Dans le Listing4.74,
vous pouvez voir comment vous pouvez intégrer les modules requis et
comment vous devez adapter la fonction constructeur en conséquence.
Le module async_hooks fournit une API pour enregistrer les fonctions de rappel qui suivent les
ressources asynchrones créées dans les applications Node.js. Ce module est accessible à l'aide de la
commande suivante:
Si vous utilisez la classe de travail, chaque thread aura sa propre interface async_hooks et utilisera un
nouvel ensemble d'ID asynchrones.
API générales
coup d'oeil
Le code suivant explique rapidement et complètement les interfaces de programmation générales:
const async_hooks = require ('async_hooks');
// c'est. Cela n'est pas réellement implicite car AsyncHook permet d'appeler
des rappels de version
// Expire après l'exécution de la fonction albanaise, et doit être explicitement
déclaré pour lancer les réponses de rappel
asyncHook.enable ();
async_hooks.createHook (rappels)
callbacks: <Object> Hook Callbacks à enregistrer, et peut contenir l'une des fonctions suivantes:
Cette fonction renvoie une copie du hook asynchrone AsyncHook utilisé pour désactiver et exécuter
des hooks.
Les appels init (), before (), after () et destroy () sont appelés pour leur événement asynchrone
pendant l'existence de la ressource.
Tous les rappels sont facultatifs. Si, par exemple, vous devez suivre uniquement une analyse des
ressources, la réponse sera détruite. La spécification de toutes les fonctions qui peuvent être passées
aux callbacks se trouve dans la section "Callback Hook", qui sera mentionnée plus tard.
class MyAsyncCallbacks {
init (asyncId, type, triggerAsyncId, ressource) {}
détruire (asyncId) {}
}
La raison derrière le comportement du gestionnaire d'erreurs de cette manière est que ces rappels sont
effectués à des points fréquemment volatils et temporaires pendant l'existence d'un objet, comme lors
de la création et de la suppression d'une classe. En conséquence, il est nécessaire d'arrêter rapidement
ce processus pour éviter toute interruption involontaire à l'avenir. Cela sera sujet à changement si une
analyse approfondie est faite et des exceptions sont faites qui peuvent suivre le chemin de contrôle
normal sans aucun effet secondaire inattendu.
asyncHook.enable ()
Cette fonction renvoie une référence à asyncHook, en effectuant le rappel pour le AsyncHook donné.
Si aucune réponse n'est faite, l'appel à cette fonction n'aura aucun effet.
La version AsyncHook installée est désactivée par défaut. Pour l'activer immédiatement après sa
création, vous pouvez suivre le formulaire suivant:
Cette fonction renvoie une référence à asyncHook, car les réponses de rappel à la version asyncHook
fournies par le bloc de réponses du pool public asyncHook sont désactivées. Le hook ne sera pas
rappelé en cas de dysfonctionnement jusqu'à ce qu'il le fasse à nouveau.
Pour l'interface de code de cohérence (API), la copie disable () d'AsyncHook renvoie également.
Rappels de hook
Lors de l'occurrence d'événements asynchrones, les événements clés sont regroupés en quatre
sections: pendant la construction, avant d'appeler le rappel, après l'appel du rappel et lors de la
suppression de la copie.
Type de paramètre
Le type de paramètre est une chaîne de texte qui définit le type de ressource qui a appelé le rappel
init. En général, il correspondra au nom du générateur de ressources.
Il existe également le type de ressource PROMISE, qui est utilisé pour suivre les copies d'objet
Promise et le travail asynchrone planifié par elles.
Les utilisateurs peuvent connaître leur propre type lors de l'utilisation de l'intégration publique (API).
Il est possible d'avoir un conflit de noms de types, il est donc recommandé d'utiliser un préfixe
unique, tel que le nom du package npm, pour éviter tout conflit lors de l'écoute des hooks.
Le paramètre triggerAsyncId
Le paramètre triggerAsyncId est l'identificateur asyncId de la ressource qui a provoqué l'initialisation
de la nouvelle ressource, puis appelé le rappel init. Ceci est différent de
async_hooks.executionAsyncId () qui apparaît lorsque la ressource est créée tandis que
triggerAsyncId montre pourquoi la ressource a été créée.
Le code suivant est une explication pratique simple sur le paramètre triggerAsyncId:
async_hooks.createHook ({
init (asyncId, type, triggerAsyncId) {
const eid = async_hooks.executionAsyncId ();
fs.writeSync (
1, `$ {type} ($ {asyncId}): trigger: $ {triggerAsyncId} exécution: $ {eid} \
n`);
}
}). activer ();
Cet exemple donnera le résultat suivant lorsque vous envoyez le 8080 localhost nc au serveur:
TCPSERVERWRAP est le serveur qui reçoit les connexions et TCPWRAP est une nouvelle
connexion du client. Lorsqu'une nouvelle connexion est établie, une copie de TCPWrap sera créée
directement et cela se produit en dehors de la pile JavaScript (la valeur 0 renvoyée par
executionAsyncId () indique qu'il s'exécute maintenant à partir de C ++ sans pile JavaScript au-
dessus). Avec seulement ces informations, il est impossible de lier les ressources entre elles depuis la
partie à l'origine de leur création, donc triggerAsyncId attribue une tâche de propagation à toute
ressource responsable de la présence de la nouvelle ressource.
La ressource de paramètre
La ressource est un objet qui représente la ressource asynchrone réelle qui a été configurée et peut
contenir des informations utiles qui varient selon le type de paramètre. Par exemple, le paramètre de
ressource pour le type de ressource GETADDRINFOREQWRAP fournit le nom d'hôte (nom d'hôte)
utilisé lorsque vous recherchez son adresse IP dans net.Server.listen (). L'interface logicielle (API)
qui permet d'accéder à ces informations n'est actuellement pas publique. Cependant, les utilisateurs
peuvent utiliser l'API intégrée pour fournir et documenter leurs objets de ressource. Par exemple,
vous pouvez fournir un objet de ressource qui peut contenir une instruction SQL à exécuter à ce
moment-là.
Dans Promises, l'objet de ressource aura la propriété promise qui fait référence à l'objet Promise qui
est alors configuré, et la propriété isChainedPromise qui est définie sur true si l'objet Promise a un
objet AP de type Promise, ou la valeur false existe dans le cas contraire. Si, par exemple, nous
regardons b = a. Alors (gestionnaire), nous trouvons que a est un objet Promise de l'objet b; b est une
promesse enchaînée.
La ressource est parfois réutilisée pour des raisons de performances, mais il n'est pas sûr de l'utiliser
comme clé dans l'objet WeakMap ou pour lui ajouter des attributs.
laissez indenter = 0;
async_hooks.createHook ({
init (asyncId, type, triggerAsyncId) {
const eid = async_hooks.executionAsyncId ();
const indentStr = '' .repeat (indent);
fs.writeSync (
1,
'$ {indentStr} $ {type} ($ {asyncId}): `+
`trigger: $ {triggerAsyncId} exécution: $ {eid} \ n`);
},
avant (asyncId) {
const indentStr = '' .repeat (indent);
fs.writeSync (1, `$ {indentStr} avant: $ {asyncId} \ n`);
retrait + = 2;
},
après (asyncId) {
retrait - = 2;
const indentStr = '' .repeat (indent);
fs.writeSync (1, `$ {indentStr} après: $ {asyncId} \ n`);
},
détruire (asyncId) {
const indentStr = '' .repeat (indent);
fs.writeSync (1, `$ {indentStr} destroy: $ {asyncId} \ n`);
},
}). activer ();
TTYWRAP (6) -> Timeout (4) -> TIMERWRAP (5) -> TickObject (3) ->
root (1)
TCPSERVERWRAP ne fait pas partie de ce schéma même si c'était une raison pour appeler
console.log (). En effet, le processus de liaison d'un port sans nom d'hôte est un processus
synchronisé. Dans tous les cas, pour garder l'interface du logiciel complètement désynchronisée, le
rappel de l'utilisateur doit être placé dans process.nextTick ().
Le graphique montre uniquement quand la ressource a été créée et ne montre pas comment, utilisez
donc triggerAsyncId pour suivre comment la construction est créée.
avant (asyncId)
asyncId: <number> Le nombre représente un identificateur unique (ID) pour la ressource asynchrone.
Lorsqu'un processus asynchrone (comme une réception de serveur TCP) commence ou s'achève
(comme l'écriture de données sur le disque dur), un rappel est appelé pour alerter l' utilisateur, mais le
rappel est appelé avant avant d'exécuter l'identifiant unique attribué à la ressource sur laquelle le
rappel est sur le point d'être implémenté.
Le rappel sera appelé de 0 à N une fois qu'il ne sera jamais appelé (0 fois) si l'opération asynchrone
est annulée ou si le serveur TCP n'a reçu aucune connexion.
Les ressources continues - comme un serveur TCP - appelleront l'avant plusieurs fois tandis que
d'autres ressources - telles que fs.open () - seront appelées une fois.
après (asyncId)
asyncId: <number> Le nombre représente un identificateur unique (ID) pour la ressource asynchrone.
Un rappel est appelé après que la réponse de rappel spécifiée dans before soit terminée
immédiatement.
L'exception non interceptée se produit pendant l'exécution du rappel, et s'exécutera ensuite après que
l'événement déclenche «uncaughtException» ou exécute le gestionnaire de domaine de domaine.
détruire (asyncId)
asyncId: <number> Le nombre représente un identificateur unique (ID) pour la ressource asynchrone.
Un appel à destroy est appelé après la destruction de la ressource correspondant au paramètre asyncId
donné. Il est également appelé de manière asynchrone depuis l'interface du logiciel embarqué
(embedder) via emitDestroy ().
Certaines ressources dépendent du garbage collection pour être analysées, donc si vous créez une
ressource pour la ressource qui est passée au rappel d'initialisation, il est possible que le rappel
n'appelle pas du tout une destruction, provoquant ainsi une fuite de mémoire dans l'application. . Ceci
n'est pas pris en compte si le fournisseur ne dépend pas des déchets.
promiseResolve (asyncId)
asyncId: <number> Le nombre représente un identificateur unique (ID) pour la ressource asynchrone.
Cet appel est appelé lorsque la fonction resolver () est appelée sur l'objet Promise (soit directement,
soit via d'autres méthodes Promise).
L'objet Promise ne doit pas nécessairement être complété ou rejeté à ce stade s'il a été accepté sur la
base de l'hypothèse d'un état particulier d'un autre objet Promise.
nouvelle promesse ((résoudre) => résoudre (vrai)) alors ((a) => {});
Appelez les réponses d'appel suivantes:
init pour PROMISE avec id 5, trigger id: 1
promesse résoudre 5 # résoudre (vrai) Cela correspond
init pour PROMISE avec id 6, trigger id: 5 # Promise L'objet then () renvoie la fonction
avant 6 # puis () je donne un rappel
promise résoudre 6 # promise L'objet turn then () accepte le rappel
après 6
async_hooks.executionAsyncId ()
Ajouté dans la version: v8.1.0
Cette fonction renvoie le numéro asyncId, qui représente un identificateur unique pour le contexte
d'exécution actuel, et est utile dans le processus de suivi lorsque vous appelez quoi que ce soit.
const async_hooks = require ('async_hooks');
Notez que le contexte Promise peut ne pas apporter une valeur valide à l'identificateur
executionAsyncIds par défaut. (Voir la section «Promesse de suivi» suivante).
Voici un exemple:
Notez que le rappel nécessite ensuite qu'il soit exécuté dans la portée externe, bien qu'il existe un saut
asynchrone commun. Notez également que la valeur de l'identificateur triggerAsyncId est 0, ce qui
signifie qu'il nous manque un contexte de la ressource qui a déclenché le rappel then (). L'installation
de hooks asynchrones via async_hooks.createHook suit l'exécution de la promesse. Par exemple,
vérifiez le code suivant:
Dans cet exemple, l'ajout de toute fonction de hook physique respecte les promesses. Il y a deux
promesses dans cet exemple; le premier a été créé via Promise.resolve (), et le second a été renvoyé
en appelant then (). La valeur de l'identifiant asyncId pour la première promesse est 6 et la deuxième
promesse est 7. Lors de l'exécution du callback then (), nous nous exécutions alors dans le cadre de la
promesse qui a la valeur 7 de l'identifiant asyncId. Cette promesse a été appelée via une ressource
asynchrone 6.
Une autre chose à propos de l'exactitude des promesses est que la réponse avant et après n'est mise en
œuvre qu'avec des promesses enchaînées. Cela signifie que les promesses qui ne sont pas générées
par la fonction then () ou la fonction catch () ne déclencheront pas l'appel avant et après. Pour plus
d'informations, consultez les détails de la version PromiseHooks V8.
AsyncResource
AsyncResource est conçu pour être extensible par des ressources intégrées asynchrones. Lorsqu'ils
sont utilisés, les utilisateurs peuvent facilement appeler des événements à tout moment avec leurs
ressources.
L'appel init sera appelé lorsqu'une copie de la classe AsyncResource est créée. Le code suivant donne
un aperçu de l'interface du logiciel AsyncResource:
type: <string> Une chaîne de texte qui représente le type d'événement asynchrone.
Options: <Object> Objet de type Object contient l'une des options suivantes:
triggerAsyncId: <numéro> Le numéro qui représente l'ID de contexte d'exécution qui a généré cet
événement asynchrone. La valeur par défaut est: executionAsyncId ().
requireManualDestroy: <boolean> Une valeur booléenne plante ou fait automatiquement
emitDestroy quand elle sort l'objet de la corbeille. Cette option n'est généralement pas définie (même
si vous appelez emitDestroy manuellement) à moins que vous ne renvoyiez l'identifiant asyncId à la
ressource et que vous l'utilisiez ensuite avec l'interface du logiciel emitDestroy. La valeur par défaut
est: false.
Fermer () {
this.db = null;
this.emitDestroy ();
}
}
fn: <Fonction> Fonction à appeler dans le contexte d'exécution de cette ressource synchrone.
thisArg: <any> Tout type de données JavaScript, représentant le récepteur (récepteur) à utiliser avec
l'appel de fonction.
... args: <any> Tout type de données JavaScript et représente les arguments supplémentaires à
transmettre à la fonction.
Examinez l'exemple pratique suivant qui explique l'utilisation de cette fonction:
la classe DBQuery étend AsyncResource {
constructeur (db) {
super ('DBQuery');
this.db = db;
}
Fermer () {
this.db = null;
this.emitDestroy ();
}
}
fn: <Fonction> Fonction à appeler dans le cadre de l'exécution de cette ressource asynchrone.
thisArg: <any> Tout type de données JavaScript, représentant le récepteur (récepteur) à utiliser avec
l'appel de fonction.
... args: <any> Tout type de données JavaScript et représente les arguments supplémentaires à
transmettre à la fonction.
Cette fonction appelle la fonction qui lui est passée avec les arguments donnés dans le contexte
d'exécution de la ressource asynchrone. Cela va créer le contexte, puis lancer AsyncHooks avant le
rappel, puis appeler la fonction, puis lancer AsyncHooks après le rappel, puis restaurer le contexte
d'exécution d'origine.
asyncResource.emitBefore ()
Ignorer depuis la publication: v9.6.0
Cette fonction appelle tous les rappels avant de commencer à créer un nouveau contexte d'exécution.
Si vous appelez emitBefore () plusieurs fois, il suivra les identificateurs asyncId dans la pile et les
éliminera dans l'ordre dans lequel vous avez été appelé.
Le rappel doit être supprimé avant et après le même ordre qu'il a été appelé, sinon une exception que
vous ne pouvez pas corriger sera libérée et le processus s'arrêtera à ce moment-là. Pour cette raison,
les deux logiciels emitBefore et emitAfter sont ignorés. Veuillez utiliser la fonction runInAsyncScope
au lieu de cette fonction pour être plus sûr.
asyncResource.emitAfter ()
Ignorer depuis la publication: v9.6.0
Cette fonction appelle tous les rappels après. Si vous appelez emitAfter () plusieurs fois de manière
complexe, il suivra les identificateurs asyncId dans la pile et les éliminera dans l'ordre dans lequel
vous avez été appelé.
Si les appels de réponse de l'utilisateur sont une exception, emitAfter () appellera automatiquement
tous les identificateurs asyncIds de la pile si l'erreur a été traitée via le gestionnaire de domaine ou le
gestionnaire «uncaughtException».
Le rappel doit être supprimé avant et après le même ordre qu'il a été appelé, sinon une exception que
vous ne pouvez pas corriger sera libérée et le processus s'arrêtera. Pour cette raison, les deux logiciels
emitBefore et emitAfter sont ignorés. Veuillez utiliser la fonction runInAsyncScope au lieu de cette
fonction pour être plus sûr.
asyncResource.emitDestroy ()
Cette fonction appelle tous les destroyers. Il ne doit être appelé qu'une seule fois manuellement, et
une erreur sera appelée si vous en appelez plus. Laisser la ressource à collecter via le garbage
collection (GC) n'appellera pas les destroyers à ce moment-là.
asyncResource.asyncId ()
Cette fonction renvoie un nombre qui représente l'identificateur asyncId unique attribué à la
ressource.
asyncResource.triggerAsyncId ()
Cette fonction renvoie un nombre qui représente le même identificateur triggerAsyncId que celui
transmis à la classe de constructeur AsyncResource.
1