Académique Documents
Professionnel Documents
Culture Documents
commande v nvm
NVM LSRemote
Par exemple
NVM LS
$nvmlsv4.3.0
v5.5.0
Vous pouvez installer Node Version Manager en utilisant git, curl ou wget. Vous exécutez ces commandes dans Terminal sous Mac OSX.
exemple de boucle :
exemple wget :
Pour tester que NVM a été correctement installé, fermez et rouvrez le Terminal et entrez NVM. Si vous recevez un message nvm: command not found , votre système
d'exploitation ne dispose peutêtre pas du fichier .bash_profile nécessaire . Dans Terminal, entrez touch ~/.bash_profile et exécutez à nouveau le script d'installation ci
dessus.
Dans Terminal, saisissez nano .bashrc. Vous devriez voir un script d'exportation presque identique au suivant :
Ensuite, entrez nano .bash_profile pour ouvrir le profil Bash. Collez le script
d'exportation que vous avez copié dans le profil Bash sur une nouvelle ligne. Enregistrez et fermez le
Saisissez enfin nano .bashrc pour rouvrir le fichier .bashrc. Collez la ligne
source ~/.nvm/nvm.sh
NVM LS
v4.5.0
v6.7.0
nvm run 6.7.0 version ou nvm exec 6.7.0 node version Exécution du nœud v6.7.0 (npm
v3.10.3) v6.7.0
utiliser un pseudo
nvm run default version ou nvm exec default node version Exécution du nœud v6.7.0 (npm
v3.10.3) v6.7.0
Changement de version
Un cas d'utilisation approprié serait si vous souhaitez définir une autre version que la version stable comme alias par défaut. les versions avec alias par
Comme:
Ensuite, à chaque démarrage de la console/du terminal, 5.0.1 serait présent par défaut.
Note:
Chapitre 20 : http
Section 20.1 : serveur http
Un exemple basique de serveur HTTP.
var httpPort = 80 ;
http.createServer(handler).listen(httpPort, start_callback);
fonction start_callback(){
'
console.log('Démarrer HTTP sur le port + port http)
}
nœud http_server.js
vous devez maintenant tester votre serveur, vous devez ouvrir votre navigateur Internet et accéder à cette URL :
http://127.0.0.1:80
si votre machine exécute un serveur Linux, vous pouvez la tester comme ceci :
boucle 127.0.0.1:80
d'accord
dans votre console, en exécutant l'application, vous verrez les résultats suivants :
});
req.on('erreur', function(e)
'
{ console.log('problème avec la requête : + e.message);
});
req.end();
nœud http_client.js
Type de flux inscriptible dans lequel les données peuvent être écrites
Transform Stream Type de flux duplex qui peut transformer les données au fur et à mesure de leur lecture puis de leur écriture.
});
});
serveur.écouter (8000);
Ce code fonctionne mais il est volumineux et met en mémoire tampon l'intégralité du fichier data.txt pour chaque requête avant de réécrire le résultat
aux clients. Si data.txt est très volumineux, votre programme pourrait commencer à consommer beaucoup de mémoire car il sert simultanément de
nombreux utilisateurs, en particulier pour les utilisateurs disposant de connexions lentes.
L'expérience utilisateur est également médiocre car les utilisateurs devront attendre que l'intégralité du fichier soit mise en mémoire tampon
sur votre serveur avant de pouvoir commencer à recevoir du contenu.
Heureusement, les deux arguments (req, res) sont des flux, ce qui signifie que nous pouvons écrire cela d'une bien meilleure manière en
utilisant fs.createReadStream() au lieu de fs.readFile() :
Ici, .pipe() se charge d'écouter les événements 'data' et 'end' de fs.createReadStream(). Ce code est non seulement plus propre, mais désormais
le fichier data.txt sera écrit sur les clients un morceau à la fois dès leur réception.
du disque.
var fs = exiger('fs')
Lorsque les flux inscriptibles sont également des flux lisibles, c'estàdire lorsqu'il s'agit de flux duplex , vous pouvez continuer à les rediriger vers d'autres flux
inscriptibles.
fs.createReadStream('style.css')
.pipe(zlib.createGzip()) // L'objet renvoyé, zlib.Gzip, est un flux duplex. .pipe(fs.createWriteStream('style.css.gz')
Les flux lisibles peuvent également être redirigés vers plusieurs flux.
Notez que vous devez rediriger vers les flux de sortie de manière synchrone (en même temps) avant que les données ne « circulent ». Dans le cas contraire, des données
Notez également que les objets de flux peuvent émettre des événements d'erreur ; assurezvous de gérer ces événements de manière responsable sur chaque flux, si
nécessaire :
Pour créer un objet Stream, nous devons utiliser le module stream fourni par NodeJs
/*
* Implémentation de la fonction d'écriture dans la classe de flux inscriptible.
* C'est la fonction qui sera utilisée lorsqu'un autre flux sera redirigé vers ce * flux inscriptible. */
fs.createReadStream("am1.js").pipe(customStream);
Cela nous donnera notre propre flux inscriptible personnalisé. nous pouvons implémenter n'importe quoi dans la fonction _write . La méthode cidessus fonctionne
dans la version NodeJs 4.xx, mais dans NodeJs 6.x ES6 a introduit les classes, la syntaxe a donc changé.
La première, qui utilise une méthode asynchrone pour lire un fichier, et fournit une fonction de rappel qui est appelée une fois le fichier
entièrement lu en mémoire :
} })
Et la seconde, qui utilise des flux afin de lire le contenu du fichier, morceau par morceau :
fileStream.on('end', () =>
{ console.log(fileContent); })
Il convient de mentionner que les deux exemples font exactement la même chose. Quelle est la différence alors ?
Lorsque les fichiers que vous traitez sont petits, l'utilisation de flux n'a aucun effet réel , mais que se passetil lorsque le fichier est
volumineux ? (si gros qu'il faut 10 secondes pour le lire en mémoire)
Sans flux, vous attendrez, sans rien faire (sauf si votre processus fait autre chose), jusqu'à ce que les 10 secondes se soient
écoulées et que le fichier soit entièrement lu, et alors seulement vous pourrez commencer à traiter le fichier.
Avec les flux, vous obtenez le contenu du fichier morceau par morceau, dès qu'il est disponible , ce qui vous permet de traiter le fichier
pendant sa lecture.
L'exemple cidessus n'illustre pas comment les flux peuvent être utilisés pour un travail qui ne peut pas être effectué en mode rappel, regardons donc un autre
exemple :
Je souhaite télécharger un fichier gzip , le décompresser et enregistrer son contenu sur le disque. Etant donné l' url du fichier, voici ce qu'il faut faire :
Téléchargez le fichier
Décompressez le fichier
Voici un [petit fichier][1], qui est stocké dans mon stockage S3 . Le code suivant effectue ce qui précède en mode rappel.
// 1339 millisecondes
.pipe(zlib.createGunzip()) .pipe(fs.createWriteStream(`${__dirname}/tweets.json`));
// 1204 millisecondes
Oui, ce n'est pas plus rapide lorsqu'il s'agit de petits fichiers le fichier testé pèse 80 Ko. Le test sur un fichier plus gros, 71 Mo compressés (382 Mo
Il a fallu 20 925 millisecondes pour télécharger 71 Mo, le décompresser, puis écrire 382 Mo sur le disque à l'aide du rappel.
mode.
En comparaison, il a fallu 13434 millisecondes pour faire la même chose avec la version streams (35% plus rapide, pour un fichier pas si gros)
Indicateurs d'exécution
Tout code exécuté dans votre application (y compris les modules externes) peut vérifier la valeur de NODE_ENV :
Dépendances
Lorsque la variable d'environnement NODE_ENV est définie sur « production », toutes les dépendances dev de votre fichier package.json seront complètement ignorées lors
de l'exécution de l'installation de npm . Vous pouvez également appliquer cela avec un indicateur production :
Les fenêtres :
définir NODE_ENV=production
export NODE_ENV=production
Cela définit NODE_ENV pour la session bash en cours. Ainsi, toutes les applications démarrées après cette instruction auront NODE_ENV défini sur production.
Cela définira NODE_ENV pour l'application actuelle uniquement. Cela est utile lorsque nous voulons tester nos applications sur différents
environnements.
Cela utilise l'idée expliquée ici. Reportezvous à cet article pour une explication plus détaillée.
Fondamentalement, vous créez un fichier .env et exécutez un script bash pour les définir sur l'environnement.
Pour éviter d'écrire un script bash, le envcmd Le package peut être utilisé pour charger les variables d'environnement définies dans le
Fichier .env .
Ce paquet permet aux variables d'environnement d'être définies d'une manière pour chaque plateforme.
Après l'avoir installé avec npm, vous pouvez simplement l'ajouter à votre script de déploiement dans package.json comme suit :
l'application en vie pour toujours, de redémarrer en cas d'échec, de recharger sans temps d'arrêt et simplifie l'administration. Les plus puissants d'entre eux (comme
PM2) avoir un équilibreur de charge intégré. PM2 vous permet également de gérer la journalisation, la surveillance et le clustering des applications.
Installation de PM2 :
Le processus peut être démarré en mode cluster impliquant un équilibreur de charge intégré pour répartir la charge entre les processus :
pm2 start app.js i 0 name "api" (i doit spécifier le nombre de processus à générer. S'il est égal à 0, le numéro de processus
sera basé sur le nombre de cœurs de processeur)
Tout en ayant plusieurs utilisateurs en production, il faut avoir un seul point pour PM2. Par conséquent, la commande pm2 doit être préfixée par un emplacement
(pour la configuration PM2), sinon elle générera un nouveau processus pm2 pour chaque utilisateur avec une configuration dans le répertoire personnel
sont le redémarrage du serveur en cas de panne, la vérification de la consommation des ressources, l'amélioration des performances d'exécution, la surveillance
etc.
Certains des gestionnaires de processus les plus populaires créés par la communauté des nœuds sont Forever, PM2, etc.
Pour toujours
pour toujours est un outil d'interface de ligne de commande permettant de garantir qu'un script donné s'exécute en continu. L'interface simple de Forever
le rend idéal pour exécuter des déploiements plus petits d' applications et de scripts Node.js.
Exécuter l'application :
Cela démarre le serveur et donne un identifiant pour le processus (commence à partir de 0).
Redémarrez l'application :
Arrêter l'application :
Semblable au redémarrage, 0 est l'identifiant du serveur. Vous pouvez également donner l'identifiant du processus ou le nom du script à la place de l'identifiant donné par Forever.
recharger sans temps d'arrêt. PM2 vous permet également de gérer la journalisation, la surveillance et le clustering des applications.
Les commandes suivantes sont utiles lorsque vous travaillez avec PM2.
liste pm2
Les applications à grande échelle nécessitent souvent des propriétés différentes lorsqu'elles sont exécutées sur différents environnements. nous pouvons y
parvenir en transmettant des arguments à l'application NodeJs et en utilisant le même argument dans le processus de nœud pour charger un fichier de
Supposons que nous ayons deux fichiers de propriétés pour un environnement différent.
dev.json
{
"PORT": 3000,
"DB":
{ "host": "localhost",
"user": "bob",
"password": "12345"
}
}
qa.json
{
"PORT": 3001,
"DB":
{ "host": "where_db_is_hosted",
"user": "bob",
"password": "54321"
}
}
Le code suivant dans l'application exportera le fichier de propriétés respectif que nous souhaitons utiliser.
}
});
si nous utilisons le gestionnaire de processus pour toujours , c'est aussi simple que
if (cluster.isMaster) { // Dans
la vraie vie, vous utiliseriez probablement plus de 2 travailleurs, // et ne
placeriez peutêtre pas le maître et le travailleur dans le même fichier. // // Vous
cluster.on('déconnecter', function(worker) {
console.error('déconnecter!'); //
clearTimeout(délai d'attente);
cluster.fork(); });
} else
{ require('./app.js');
Node.js
Si vous choisissez de gérer SSL/TLS dans votre application Node.js, considérez que vous êtes également responsable du maintien de la prévention
des attaques SSL/TLS à ce stade. Dans de nombreuses architectures serveurclient, SSL/TLS se termine sur un proxy inverse, à la fois pour
réduire la complexité des applications et la portée de la configuration de sécurité.
Si votre application Node.js doit gérer SSL/TLS, elle peut être sécurisée en chargeant les fichiers de clé et de certificat.
Si votre fournisseur de certificat nécessite une chaîne d'autorité de certification (CA), elle peut être ajoutée dans l' option ca sous forme de tableau.
Une chaîne avec plusieurs entrées dans un seul fichier doit être divisée en plusieurs fichiers et entrée dans le même ordre dans le tableau, car
Node.js ne prend actuellement pas en charge plusieurs entrées ca dans un seul fichier. Un exemple est fourni dans le code cidessous pour
les fichiers 1_ca.crt et 2_ca.crt. Si le tableau ca est requis et n'est pas défini correctement, les navigateurs clients peuvent afficher des messages
indiquant qu'ils n'ont pas pu vérifier l'authenticité du certificat.
Exemple
Cela peut se produire parce que des cookies sont envoyés à chaque demande adressée à un site Web, même lorsque ces demandes proviennent
d'un autre site.
Nous pouvons utiliser le module csurf pour créer un jeton csrf et le valider.
Exemple
Ainsi, lorsque nous accédons à GET /form, il transmettra le jeton csrf csrfToken à la vue.
Maintenant, dans la vue, définissez la valeur csrfToken comme valeur d'un champ de saisie masqué nommé _csrf.
formulaire(action="/processus" méthode="post")
input(type="hidden", nom="_csrf", valeur=csrfToken)
span Nom :
input(type="text", name="name", obligatoire=true) br
entrée(type="soumettre")
et HTTPS !
1. créez le dossier dans lequel vous souhaitez stocker votre clé et votre certificat :
mkdir conf
conférence cd
wget https://raw.githubusercontent.com/anders94/httpsauthorizedclients/master/keys/ca.cnf
openssl req new x509 days 9999 config ca.cnf keyout cakey.pem out cacert.pem
5. maintenant que nous avons notre autorité de certification dans cakey.pem et cacert.pem, générons une clé privée pour
le serveur :
wget https://raw.githubusercontent.com/anders94/httpsauthorizedclients/master/keys/server.cnf
8. signez la demande :
openssl x509 req extfile server.cnf days 999 passin "pass:mot de passe" in csr.pem CA cacert.pem CAkey ca
key.pem CAcreateserial out cert.pem
sudo updatecacertificats
https.createServer(httpsOptions, app).listen(4433);
Si vous souhaitez également prendre en charge les requêtes http, vous devez effectuer cette petite modification :
http.createServer(app).listen(8888);
https.createServer(httpsOptions, app).listen(4433);
La configuration pour établir une connexion sécurisée à l'aide d'express.js (Depuis la version 3) :
var informations d'identification = {clé : clé privée, cert : certificat} ; var express =
require('express'); var app = express();
httpServeur.écouter(8080);
httpsServeur.écouter(8443);
Si vous souhaitez que votre application s'exécute sur des ports inférieurs à 1024, vous devrez utiliser la commande sudo (non recommandée) ou utiliser
un proxy inverse (par exemple nginx, haproxy).
Pour vérifier si nous avons réussi à nous connecter à la base de données, nous pouvons utiliser les événements open, erreur de l' objet
mongoose.connection .
var db = mangouste.connection;
db.on('erreur', console.error.bind(console, 'erreur de connexion :')); db.once('open',
function() { // nous sommes
connectés ! });
Installation
Ensuite, ajoutez des dépendances à server.js, créez le schéma de base de données et le nom de la collection, créez un serveur Express.js et connectez
vous à MongoDB :
Ajoutez maintenant les routes Express.js que nous utiliserons pour interroger les données :
Model.find({ 'request':
query }, function(err, result) { if
(err) throw err; if (result)
{ res.json(result) }
else
{ res.send(JSON.stringify({ erreur :
'Erreur'
}))
}
})
})
{
"_id" : ObjectId("578abe97522ad414b8eeb55a"), "request" :
"JavaScript est génial", "time" : 1468710551
}{
"_id" : ObjectId("578abe9b522ad414b8eeb55b"), "request" :
"JavaScript est génial", "time" : 1468710555
}{
"_id" : ObjectId("578abea0522ad414b8eeb55c"), "request" :
"JavaScript est génial", "time" : 1468710560
Et que le but est de retrouver et d'afficher tous les documents contenant uniquement le mot "JavaScript" sous la touche "requête" .
Pour ce faire, créez d'abord un index de texte pour "requête" dans la collection. Pour cela, ajoutez le code suivant à server.js :
Et remplacez :
Model.find({ 'request':
query }, function(err, result) {
Avec:
Model.find({ $text :
{ $search :
requête
}
}, fonction (erreur, résultat) {
Ici, nous utilisons les opérateurs $text et $search MongoDB pour rechercher tous les documents de la collection collectionName
qui contient au moins un mot de la requête de recherche spécifiée.
Usage
Pour l'utiliser pour rechercher des données, accédez à l'URL suivante dans un navigateur :
http://localhost:8080/find/<requête>
Exemple:
http://localhost:8080/find/JavaScript
Sortir:
[{
_id : « 578abe97522ad414b8eeb55a »,
requête : « JavaScript est génial », heure :
1468710551, __v : 0
},
{
_id : « 578abe9b522ad414b8eeb55b »,
requête : « JavaScript est génial », heure :
1468710555, __v : 0
},
{
_id : « 578abea0522ad414b8eeb55c »,
requête : « JavaScript est génial », heure :
1468710560, __v : 0
}]
Section 24.3 : Enregistrer les données sur MongoDB à l'aide des routes
Mongoose et Express.js
Installation
Ensuite, ajoutez des dépendances à votre fichier server.js , créez le schéma de base de données et le nom de la collection, créez un serveur Express.js et connectez
vous à MongoDB :
{ collection : 'collectionName'
});
Ajoutez maintenant les routes Express.js que nous utiliserons pour écrire les données :
si (résultat)
{ res.json (résultat)
}
})
})
Ici, la variable de requête sera le paramètre <query> de la requête HTTP entrante, qui sera enregistrée dans
MongoDB :
Si une erreur se produit lors de la tentative d'écriture sur MongoDB, vous recevrez un message d'erreur sur la console. Si tout réussit, vous verrez les
//...
si (résultat)
{ res.json (résultat)
}
}) //...
Maintenant, vous devez démarrer MongoDB et exécuter votre fichier server.js à l'aide du nœud server.js.
Usage
Pour l'utiliser pour enregistrer des données, accédez à l'URL suivante dans votre navigateur :
http://localhost:8080/save/<query>
Exemple:
http://localhost:8080/save/JavaScript%20is%20Awesome
{
__v : 0,
requête : "JavaScript est génial", heure :
1469411348, _id :
"57957014b93bc8640f2c78c4"
}
Section 24.4 : Rechercher des données dans MongoDB à l'aide des routes
Mongoose et Express.js
Installation
Ensuite, ajoutez des dépendances à server.js, créez le schéma de base de données et le nom de la collection, créez un serveur Express.js et connectez
vous à MongoDB :
{ collection : 'collectionName'
});
Ajoutez maintenant les routes Express.js que nous utiliserons pour interroger les données :
Model.find({ 'request':
query }, function(err, result) { if
(err) throw err; if (result)
{ res.json(result) }
else
{ res.send(JSON.stringify({ erreur :
'Erreur'
}))
}
})
})
{
"_id" : ObjectId("578abe97522ad414b8eeb55a"), "request" :
"JavaScript est génial", "time" : 1468710551
}{
"_id" : ObjectId("578abe9b522ad414b8eeb55b"), "request" :
"JavaScript est génial", "time" : 1468710555
}{
"_id" : ObjectId("578abea0522ad414b8eeb55c"), "request" :
"JavaScript est génial", "time" : 1468710560
Et le but est de retrouver et d'afficher tous les documents contenant "JavaScript is Awesome" sous la touche "request" .
Usage
Pour l'utiliser pour rechercher des données, accédez à l'URL suivante dans un navigateur :
http://localhost:8080/find/<requête>
Exemple:
http://localhost:8080/find/JavaScript%20is%20Awesome
Sortir:
[{
_id : « 578abe97522ad414b8eeb55a »,
requête : « JavaScript est génial », heure :
1468710551, __v : 0
},
{
_id : « 578abe9b522ad414b8eeb55b »,
requête : « JavaScript est génial », heure :
1468710555, __v : 0
},
{
_id : « 578abea0522ad414b8eeb55c »,
requête : « JavaScript est génial », heure :
1468710560, __v : 0
}]
doc.find({'some.value':5},function(err,docs){
// renvoie la documentation du tableau
});
doc.findOne({'some.value':5},function(err,doc){
// renvoie le document doc
});
doc.findById(obj._id,function(err,doc){ //renvoie le
document doc
});
Connexion mangouste
obligatoire : vrai,
unique : vrai
},
e
mail : { type :
Chaîne, obligatoire : vrai
},
mot de passe :
{ type : chaîne,
obligatoire : vrai
},
créé : { type :
Date, par
défaut : Date.now
}
});
Par défaut, mangoose ajoute deux nouveaux champs dans notre modèle, même lorsque ceuxci ne sont pas définis dans le modèle. Ceux
les champs sont :
_identifiant
Mongoose attribue à chacun de vos schémas un champ _id par défaut s'il n'est pas transmis au constructeur de schéma.
Le type attribué est un ObjectId qui coïncide avec le comportement par défaut de MongoDB. Si vous ne souhaitez pas du tout qu'un _id soit ajouté à votre
schéma, vous pouvez le désactiver en utilisant cette option.
{ _id : false
});
__v ou versionKey
La versionKey est une propriété définie sur chaque document lors de sa première création par Mongoose. Cette valeur de clé contient la révision interne du
document. Le nom de cette propriété de document est configurable.
{ versionKey : false
});
Index composés
Nous pouvons créer d'autres index en plus de ceux créés par Mongoose.
usersSchema.index({email : 1 });
Dans ce cas, notre modèle dispose de deux index supplémentaires, un pour le champ nom d'utilisateur et un autre pour le champ email. Mais nous pouvons
Par défaut, Mongoose appelle toujours le EnsureIndex pour chaque index de manière séquentielle et émet un événement « index » sur le modèle
lorsque tous les appels EnsureIndex ont réussi ou lorsqu'il y a eu une erreur.
Dans MongoDB, EnsureIndex est obsolète depuis la version 3.0.0, c'est désormais un alias pour createIndex.
Il est recommandé de désactiver le comportement en définissant l'option autoIndex de votre schéma sur false, ou globalement sur la connexion en
définissant l'option config.autoIndex sur false.
usersSchema.set('autoIndex', false);
Installation
Ensuite, ajoutez des dépendances à server.js, créez le schéma de base de données et le nom de la collection, créez un serveur Express.js et connectez
vous à MongoDB :
{ collection : 'collectionName'
});
Ajoutez maintenant les routes Express.js que nous utiliserons pour interroger les données :
}) .exec() //n'oubliez pas d'ajouter exec, les requêtes ont un attribut .then mais ne sont pas des
promesses .then(function(result)
{ if (result)
{ res.json(result) }
else
{ next() / /passer au gestionnaire 404
}
{
"_id" : ObjectId("578abe97522ad414b8eeb55a"), "request" :
"JavaScript est génial", "time" : 1468710551
}{
"_id" : ObjectId("578abe9b522ad414b8eeb55b"), "request" :
"JavaScript est génial", "time" : 1468710555
}{
"_id" : ObjectId("578abea0522ad414b8eeb55c"), "request" :
"JavaScript est génial", "time" : 1468710560
Et le but est de retrouver et d'afficher tous les documents contenant "JavaScript is Awesome" sous la touche "request" .
Usage
Pour l'utiliser pour rechercher des données, accédez à l'URL suivante dans un navigateur :
http://localhost:8080/find/<requête>
Exemple:
http://localhost:8080/find/JavaScript%20is%20Awesome
Sortir:
[{
_id : « 578abe97522ad414b8eeb55a »,
requête : « JavaScript est génial », heure :
1468710551, __v : 0
},
{
_id : « 578abe9b522ad414b8eeb55b »,
requête : « JavaScript est génial », heure :
1468710555, __v : 0
},
{
_id : « 578abea0522ad414b8eeb55c »,
requête : « JavaScript est génial », heure :
1468710560, __v : 0
}]
Chapitre 25 : async.js
Section 25.1 : Parallèle : multitâche
async.parallel (tâches, afterTasksCallback) exécutera un ensemble de tâches en parallèle et attendra la fin de toutes les tâches (signalée par l'appel
de la fonction de rappel ).
Lorsque les tâches sont terminées, appelez de manière asynchrone le rappel principal avec toutes les erreurs et tous les résultats des tâches.
function shortTimeFunction(callback)
{ setTimeout(function()
{ callback(null, 'resultOfShortTime'); }, 200);
function mediumTimeFunction(callback)
{ setTimeout(function()
{ callback(null, 'resultOfMediumTime'); }, 500);
function longTimeFunction(callback)
{ setTimeout(function()
{ callback(null, 'resultOfLongTime'); }, 1000);
async.parallel([ shortTimeFunction,
mediumTimeFunction,
longTimeFunction ], function(err,
results) { if
(err) { return console.error(err);
}
console.log(résultats); });
Vous pouvez remplacer le paramètre du tableau de tâches par un objet. Dans ce cas, les résultats seront également un objet avec les mêmes
clés que les tâches.
C'est très utile pour calculer certaines tâches et retrouver facilement chaque résultat.
async.parallel({ short:
shortTimeFunction, medium:
mediumTimeFunction, long:
longTimeFunction },
console.log(résultats); });
Chaque fonction parallèle reçoit un rappel. Ce rappel peut soit renvoyer une erreur comme premier argument, soit des valeurs de réussite par la
suite. Si un rappel reçoit plusieurs valeurs de réussite, ces résultats sont renvoyés sous forme de tableau.
async.parallel({ court :
function shortTimeFunction(callback) {
setTimeout(function()
{ callback(null, 'resultOfShortTime1', 'resultOfShortTime2'); }, 200); }, support :
fonction
mediumTimeFunction(callback) {
setTimeout(function()
{ callback(null, 'resultOfMediumTime1', 'resultOfMeiumTime2'); }, 500);
console.log(résultats); });
Résultat :
{
court : ["resultOfShortTime1", "resultOfShortTime2"], moyen :
["resultOfMediumTime1", "resultOfMediumTime2"]
}
}, function(err) { //Si
l'une des créations d'utilisateurs échoue, une erreur peut être
générée.
if( err ) { // Une des itérations a produit une erreur.
// Tout le traitement va maintenant
s'arrêter. console.log('impossible de créer un
utilisateur'); } else { console.log('Tous les utilisateurs ont été créés avec succès');
}
});
Lorsque les tâches sont terminées avec succès, appelez de manière asynchrone le rappel « maître » avec toutes les erreurs et tous les résultats des tâches.
function shortTimeFunction(callback)
{ setTimeout(function()
{ callback(null, 'resultOfShortTime'); }, 200);
function mediumTimeFunction(callback)
{ setTimeout(function()
{ callback(null, 'resultOfMediumTime'); }, 500);
function longTimeFunction(callback)
{ setTimeout(function()
{ callback(null, 'resultOfLongTime'); }, 1000);
async.series([ mediumTimeFunction,
shortTimeFunction,
longTimeFunction ],
console.log(résultats); });
Vous pouvez remplacer le paramètre du tableau de tâches par un objet. Dans ce cas, les résultats seront également un objet avec les mêmes clés que les tâches.
C'est très utile pour calculer certaines tâches et retrouver facilement chaque résultat.
async.series({ short :
shortTimeFunction, medium :
mediumTimeFunction, long :
longTimeFunction },
console.log(résultats); });
la tâche suivante. Comme async.series(), si une tâche échoue, async arrête l'exécution et appelle immédiatement le rappel principal.
Lorsque les tâches sont terminées avec succès, appelez de manière asynchrone le rappel « maître » avec toutes les erreurs et tous les résultats des tâches.
async.waterfall([ getUserRequest,
getUserFriendsRequest ],
function(err,
results) { if (err) { return console.error(err);
console.log(JSON.stringify(results)); });
Résultat : results contient le deuxième paramètre de rappel de la dernière fonction de la cascade, qui est friendsResult dans ce cas.
C'est ce qu'on appelle en parallèle. Lorsque nous voulons l'appeler un par un, utilisez : async.timesSeries
Sortir:
Se souvenir de
serveur.js :
app.get('/',function(req,res)
{ res.sendFile(__dirname + "/index.html");
});
} });
téléchargement du fichier.");
app.listen(3000,function()
{ console.log("Travail sur le port 3000");
});
index.html :
Note:
Pour télécharger un fichier avec l'extension, vous pouvez utiliser le chemin Node.js bibliothèque intégrée
et changer :
Dans cet exemple, voyez comment télécharger des fichiers pour autoriser uniquement certaines extensions.
Par exemple uniquement les extensions d’images. Ajoutez simplement à var upload =
multer({ storage : storage}).single('userFile'); condition de filtre de fichier
var upload =
multer({ stockage :
stockage, fileFilter : fonction (req, fichier, rappel) {
var ext = chemin.extname(file.originalname); if(ext !==
'.png' && ext !== '.jpg' && ext !== '.gif' && ext !== '.jpeg') { return callback(new Error('Seules les images
sont autorisées '))
} }).single('userFile');
Vous pouvez désormais télécharger uniquement des fichiers image avec des extensions png, jpg, gif ou jpeg.
retour;
}
// affiche un formulaire de
téléchargement de fichier res.writeHead(200, {'contenttype': 'text/
html'});
res.end( '<form action="/upload" enctype="multipart/formdata" method="post">'+ '<input
type="text" name="title"><br>'+ ' <input type="file"
name="upload" multiple="multiple"><br>'+ '<input type="submit" value="Upload">'+
'</form>' ); }).écouter(8080);
Serveur Node.js
})
socket.emit('messagefromservertoclient', 'Hello World!');
});
Client de navigateur
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF8">
<title>Bonjour tout le monde avec Socket.io</title> </
head>
<body>
<script src="https://cdn.socket.io/socket.io1.4 .5.js"></script> <script> var socket =
io("http://
localhost:3000"); socket.on("messageduserveurau
client", function(msg) { document.getElementById('message').innerHTML =
msg;
});
socket.emit('messageduclientauserveur', 'Bonjour tout le monde !'); </script>
<p>Le
client Socket.io Hello World a démarré !</p> <p
id="message"></p> </
body> </
html>
forceServerObjectId (facultatif) Forcer le serveur à attribuer des valeurs _id au lieu du pilote (par défaut : false)
(facultatif) Autoriser le pilote à contourner la validation du schéma dans MongoDB 3.2 ou version ultérieure (par défaut :
bypassDocumentValidation faux)
MongoDB.connect('mongodb://localhost:27017/databaseName')
.then (fonction (base de données) {
const collection = base de données.collection('collectionName');
return collection.insert({clé : 'valeur'});
}) .then(fonction(résultat) {
console.log(résultat);
});
```
err : Error Si une erreur se produit, l' argument err sera défini db : object
L'instance MongoDB
err : Error Si une erreur se produit, l' argument err sera défini result :
object Un objet contenant des détails sur l'opération d'insertion
} }); });
db.collection(collection).find()
});
});
constPORT = 8080 ;
const server = http.createServer((request, réponse) => { let buffer = '';
request.on('data',
chunk => { buffer += chunk; });
request.on('end', ( )
=>
{
const réponseString = `Chaîne reçue ${buffer}` ; console.log(`Répondre
avec : ${responseString}`); réponse.writeHead(200, "ContentType :
texte/plain"); réponse.end(responseString); }); }).listen(PORT, () =>
{ console.log(`Écoute sur ${PORT}`); });
//OBTENIR tous
les éléments server.get('/item', function (req, res)
{ res.json(itemStore);
});
//POST nouvel
élément server.post('/item', function (req, res)
{ itemStore.push(req.body);
res.json(req.body);
});
// DÉMARRER LE
SERVEUR server.listen (3000, function ()
{ console.log ("Serveur en cours d'exécution");
})
Documents http://mozilla.github.io/nunjucks/
Installer npm i nunjucks
app.js
});
env.addGlobal('myFunc', function(obj, arg1)
{ console.log('myFunc', obj, arg1); // Faire
quelque chose avec obj
return obj;
});
app.écouter(3000, fonction() {
console.log('Exemple d'application écoutant sur le port 3000...');
});
/views/index.html
<html>
<tête>
<title> Exemple de Nunjucks</title>
</head>
<body>
{% bloquer le contenu
%} {{title}}
{% endblock %} </
body> </
html>
/views/foo.html
{% étend "index.html" %}
Node.js fournit un utilitaire de débogage non graphique intégré. Pour démarrer le build dans le débogueur, démarrez l'application avec cette
commande :
« utiliser strict » ;
Référence de commande
1. Faire un pas
2. Points d'arrêt
Une fois les commandes cidessus exécutées, vous verrez la sortie suivante. Pour quitter l'interface du débogueur, tapez process.exit()
Utilisez la commande watch(expression) pour ajouter la variable ou l'expression dont vous souhaitez surveiller la valeur et redémarrer pour redémarrer l'application et le
débogage.
Utilisez repl pour saisir le code de manière interactive. Le mode repl a le même contexte que la ligne que vous déboguez. Cela vous permet d'examiner le contenu des variables et
de tester des lignes de code. Appuyez sur Ctrl+C pour quitter le remplacement de débogage.
Vous pouvez exécuter le nœud intégré inspecteur v8 ! L' inspecteur de nœuds le plugin n’est plus nécessaire.
Passez simplement le drapeau de l'inspecteur et vous recevrez une URL vers l'inspecteur.
http://localhost:8080/debug?port=5858
Parfois, le port 8080 peut ne pas être disponible sur votre ordinateur. Vous pouvez obtenir l'erreur suivante :
Dans ce cas, démarrez l'inspecteur de nœuds sur un autre port à l'aide de la commande suivante.
$nodeinspector webport=6500
};
} autre
{ réponse.writeHead(500);
réponse.end('Désolé, vérifiez auprès de l'administrateur du site l'erreur : '+error.code+' ..\n'); réponse.end();
} else
{ réponse.writeHead(200, { 'ContentType': contentType });
réponse.end(content, 'utf8');
} });
}).écouter(8125);
console.log('Serveur exécuté sur http://127.0.0.1:8125/');
// Défini sur true si vous avez besoin que le site Web inclue des cookies dans les requêtes
envoyées // à l'API (par exemple si vous utilisez des
sessions) réponse.setHeader('AccessControlAllowCredentials', true);
Plus de détails sur Node et ES6 peuvent être trouvés sur leur site https://nodejs.org/en/docs/es6/
Vous pouvez voir une liste des fonctionnalités ES6 actuellement prises en charge sur http://node.green/
Depuis NodeJS v6, le support est assez bon. Donc, si vous utilisez NodeJS v6 ou supérieur, vous pouvez profiter d'ES6.
Cependant, vous souhaiterez peutêtre également utiliser certaines des fonctionnalités inédites et d’autres. Pour cela vous devrez utiliser un transpileur
Il est possible d'exécuter un transpilateur au moment de l'exécution et de la construction, d'utiliser toutes les fonctionnalités d'ES6 et bien plus encore. Le
Babel vous permet d'utiliser toutes les fonctionnalités de la spécification ES6 et certaines fonctionnalités supplémentaires non
spécifiées avec 'stage0' telles que l'importation d'un objet depuis 'thing au lieu de var thing = require('thing')
Si nous voulions créer un projet dans lequel nous utilisons des fonctionnalités « étape 0 » telles que l'importation, nous devrons ajouter Babel comme
transpilateur. Vous verrez des projets utilisant React et Vue et d'autres modèles basés sur CommonJS implémenter assez souvent l'étape 0.
mkdir mones6app
cd mones6app
npm init
Notez que nous utilisons une importation http depuis 'http'. Il s'agit d'une fonctionnalité de niveau 0 et si cela fonctionne, cela signifie que le
transpilateur fonctionne correctement.
Si vous exécutez node server.js, il échouera sans savoir comment gérer l'importation.
Créez un fichier .babelrc à la racine de votre répertoire et ajoutez les paramètres suivants
{
"presets": ["es2015", "stage2"], "plugins": []
vous pouvez maintenant exécuter le serveur avec le nœud src/index.js exec babelnode
Terminer ce n'est pas une bonne idée d'exécuter un transpilateur au moment de l'exécution sur une application de production. Nous pouvons cependant implémenter
"scripts": { "start":
"node dist/index.js", "dev": "babelnode src/
index.js", "build": "babel src d dist", "postinstall":
" npm run build" },
Ce qui précède, lors de l'installation de npm , construira le code transpilé dans le répertoire dist, permettant à npm start d'utiliser le code transpilé
pour notre application de production.
npm run dev démarrera le serveur et le runtime babel, ce qui est très bien et préféré lorsque vous travaillez sur un projet localement.
En allant plus loin, vous pouvez ensuite installer nodemon npm install nodemon savedev pour surveiller les modifications, puis redémarrer
l'application de nœud.
Cela accélère vraiment le travail avec Babel et NodeJS. Dans votre package.json, mettez simplement à jour le script "dev" pour utiliser nodemon
Conditions préalables:
1. Découvrez les nouvelles fonctionnalités d'es6 sur http://es6features.org cela peut vous clarifier si vous avez vraiment l'intention de l'utiliser sur votre prochaine
application NodeJS
Voici un très court échantillon d'une simple application Hello World avec JS es6
'utiliser strict'
Programme de classe
{
constructeur() {
imprimer()
{
setTimeout(() =>
{
console.log(ce.message);
this.print();
}, Math.random() * 1000);
}
}
nouveau programme().print();
Vous pouvez exécuter ce programme et observer comment il imprime le même message encore et encore.
'utiliser strict'
Cette ligne est en fait requise si vous avez l'intention d'utiliser js es6. le mode strict , intentionnellement, a une sémantique différente
du code normal (veuillez en savoir plus sur MDN https://
developer.mozilla.org/enUS/docs/Web/JavaScript/Reference/Strict_mode)
Programme de classe
Incroyable un motclé de classe ! Juste pour une référence rapide avant Es6, la seule façon de définir une classe en js était avec le motclé... function !
var maClasseObject = new MaClasse(); // génération d'un nouvel objet avec un type MyClass
Lors de l'utilisation de la POO, une classe est une capacité très fondamentale qui aide le développeur à représenter une partie spécifique d'un
système (la décomposition du code est cruciale lorsque le code devient plus volumineux... par exemple : lors de l'écriture de code côté serveur)
constructeur() {
Vous devez l’admettre : c’est assez intuitif ! C'est le c'tor de ma classe cette "fonction" unique se produira chaque fois qu'un objet est créé à partir de
cette classe particulière (dans notre programme une seule fois)
imprimer()
{
setTimeout(() => // ceci est une fonction 'flèche' {
console.log(ce.message);
this.print(); // ici nous appelons la méthode 'print' à partir du modèle de classe luimême (une récursion
dans ce cas particulier)
}, Math.random() * 1000);
}
Parce que print est défini dans la portée de la classe il s'agit en fait d'une méthode qui peut être invoquée depuis l'objet de
Donc... jusqu'à présent, nous avons défini notre classe... il est temps de l'utiliser :
nouveau programme().print();
var prog = nouveau programme (); // définit un nouvel objet de type 'Programme'
En conclusion : JS es6 peut simplifier votre code le rendre plus intuitif et facile à comprendre (par rapport à la version précédente de JS). Vous pouvez
APPRÉCIER :)
Semblable à l'environnement de navigateur de JavaScript, node.js fournit un module de console qui offre des possibilités simples de journalisation et
de débogage.
Les méthodes les plus importantes fournies par le module console sont console.log, console.error et console.time.
Mais il en existe plusieurs autres comme console.info.
console.log
Les paramètres seront imprimés sur la sortie standard (stdout) avec une nouvelle ligne.
console.erreur
Les paramètres seront imprimés à l'erreur standard (stderr) avec une nouvelle ligne.
console.time, console.timeEnd
console.time démarre un minuteur avec une étiquette unique qui peut être utilisée pour calculer la durée d'une opération. Lorsque vous appelez
console.timeEnd avec la même étiquette, le minuteur s'arrête et imprime le temps écoulé en millisecondes sur
sortie standard.
Module de processus
Il est possible d'utiliser le module process pour écrire directement dans la sortie standard de la console. Il existe donc la méthode
process.stdout.write. Contrairement à console.log, cette méthode n'ajoute pas de nouvelle ligne avant votre sortie.
Ainsi, dans l’exemple suivant, la méthode est appelée deux fois, mais aucune nouvelle ligne n’est ajoutée entre leurs sorties.
Mise en page
On peut utiliser des codes de terminal (de contrôle) pour émettre des commandes spécifiques comme changer de couleur ou positionner le curseur.
Général
Code d'effet
Réinitialiser \033[0m
Hicolor \033[1m
Souligner \033[4m
Inverse \033[7m
Couleurs de police
Code d'effet
Noir \033[30m
Rouge \033[31min
Vert \033[32m
Jaune \033[33m
Bleu \033[34min
Magenta \033[35m
Cyan \033[36 min
Blanc \033[37m
Couleurs d'arrièreplan
Code d'effet
Noir \033[40m
Rouge \033[41min
Vert \033[42m
Jaune \033[43m
Bleu \033[44min
Magenta \033[45m
Cyan \033[46min
Blanc \033[47m
Pour accéder à Cassandra cassandradriver Le module de DataStax peut être utilisé. Il prend en charge toutes les fonctionnalités et peut
être facilement configuré.
};
console.error(err);
}
console.log(results.rows);
});
L'exemple suivant crée une API GET simple pour répertorier tous les utilisateurs.
Exemple
var users
=[{ identifiant : 1,
nom :
"John Doe", âge : 23, email : "john@doe.com"
}];
// GET /api/users
app.get('/api/users', function(req, res){ return
res.json(users); //renvoie la réponse au format JSON
});
app.listen('3000', function()
{ console.log('Serveur en écoute sur le port 3000');
});
Exemple
var users
=[{ identifiant : 1,
nom :
"John Doe", âge : 23, email : "john@doe.com"
}];
// GET /api/users
app.get('/api/users', function(req, res){ return
res.json(users);
});
/* POST /api/utilisateurs
{
"user":
{ "id": 3,
"name": "Utilisateur test",
"age" : 20,
"email": "test@test.com"
}
}
*/
app.post('/api/users', function (req, res) { var user =
req.body.user; users.push(user);
app.listen('3000', function()
{ console.log('Serveur en écoute sur le port 3000');
});
En utilisant server.close() et process.exit(), nous pouvons intercepter l'exception du serveur et effectuer un arrêt progressif.
process.on('SIGTERM', function ()
{ server.close(function ()
{ process.exit(0); }); });
Chapitre 40 : Utilisation d'IISNode pour héberger des applications Web Node.js dans
IIS
IISNode ne fournit pas de support direct pour les répertoires virtuels ou les applications imbriquées via la configuration. Pour y parvenir, nous devrons profiter
d'une fonctionnalité d'IISNode qui ne fait pas partie de la configuration et est beaucoup moins connue. Tous les enfants de l' élément <appSettings>
avec Web.config sont ajoutés à l' objet process.env en tant que propriétés à l'aide de la clé appSetting.
<appSettings>
<add key="virtualDirPath" value="/foo" />
</appSettings>
Maintenant que nous pouvons utiliser l' élément <appSettings> pour la configuration, profitonsen et utilisonsle dans notre
code du serveur.
// Accédez aux appSettings de virtualDirPath et donnezlui la valeur par défaut de '/' // dans le cas où
il n'existe pas ou n'est pas défini var virtualDirPath =
process.env.virtualDirPath || '/';
// Annuaire public
server.use(express.static(path.join(virtualDirPath, 'public'))); // Bower server.use('/
// Accédez aux appSettings de virtualDirPath et donnezlui la valeur par défaut de '/' // dans le cas où il
n'existe pas ou n'est pas défini var virtualDirPath =
process.env.virtualDirPath || '/';
// Annuaire public
server.use(express.static(path.join(virtualDirPath, 'public'))); // Bower server.use('/
server.listen(port, () =>
{ console.log(`Écoute sur ${port}`);
});
votre processus node.exe sous Windows, mais pourquoi le faire alors que vous pouvez simplement exécuter votre application dans IIS.
IISNode gérera la mise à l'échelle sur plusieurs cœurs, la gestion des processus de node.exe et recyclera automatiquement votre application
IIS chaque fois que votre application est mise à jour, pour ne citer que quelquesuns de ses avantages.
Exigences
IISNode a quelques exigences avant de pouvoir héberger votre application Node.js dans IIS.
1. Node.js doit être installé sur l'hôte IIS, 32 bits ou 64 bits, les deux sont pris en charge.
2. IISNode installé x86 ou x64, cela devrait correspondre au nombre de bits de votre hôte IIS.
3. Le module de réécriture d'URL Microsoft pour IIS installé sur votre hôte IIS.
C'est la clé, sinon les requêtes adressées à votre application Node.js ne fonctionneront pas comme prévu.
4. Un Web.config dans le dossier racine de votre application Node.js.
5. Configuration IISNode via un fichier iisnode.yml ou un élément <iisnode> dans votre Web.config.
Structure du projet
Il s'agit de la structure de projet de base d'une application Web IISNode/Node.js. Il semble presque identique à n’importe quelle application
Web nonIISNode, à l’exception de l’ajout du Web.config.
/app_root
package.json
serveur.js
Web.config _
// Nous devons obtenir le port que IISNode nous transmet // en utilisant la variable
d'environnement PORT, si elle n'est pas définie, utilisez une valeur par défaut const port = process.env.PORT ||
3000 ;
Configuration et Web.config
Le Web.config est comme n'importe quel autre Web.config IIS , sauf que les deux éléments suivants doivent être présents, une URL
<rewrite><rules> et un IISNode <handler>. Ces deux éléments sont des enfants de l' élément <system.webServer> .
Configuration
Vous pouvez configurer IISNode en utilisant un iisnode.yml fichier ou en ajoutant le <iisnode> élément en tant qu'enfant de
<system.webServer> dans votre Web.config. Ces deux configurations peuvent être utilisées conjointement. Cependant, dans ce cas, Web.config devra
spécifier le fichier iisnode.yml ET tout conflit de configuration sera extrait du fichier iisnode.yml. iisnode.yml fichier à la place. Ce remplacement de
configuration ne peut pas se produire dans l’autre sens.
Pour qu'IIS sache que server.js contient notre application Web Node.js, nous devons le lui dire explicitement. Nous pouvons le faire en ajoutant IISNode
<handler> à l' élément <handlers> .
<gestionnaires>
<add name="iisnode" path="server.js" verb="*" modules="iisnode"/> </handlers>
La dernière partie de la configuration consiste à garantir que le trafic destiné à notre application Node.js entrant dans notre instance IIS est dirigé vers IISNode.
Sans règles de réécriture d'URL, nous aurions besoin de visiter notre application en accédant à http://<host>/server.js et pire encore,
lorsque vous essayez de demander une ressource fournie par server.js , vous obtiendrez un 404. C'est pourquoi la réécriture d'URL est nécessaire pour
les applications Web IISNode.
<réécrire>
<règles>
<! Nous examinons d'abord si l'URL entrante correspond à un fichier physique dans le dossier /public
>
<rule name="StaticContent" patternSyntax="Wildcard">
<action type="Rewrite" url="public/{R:0}" logRewritingUrl="true"/> <conditions>
<! Toutes les autres URL sont mappées au point d'entrée de l'application Node.js > <rule
name="DynamicContent"> <conditions>
C'est un travail Web.config fichier pour cet exemple, configuration pour une installation Node.js 64 bits.
Voilà, visitez maintenant votre site IIS et voyez votre application Node.js fonctionner.
Étant donné que Socket.io envoie des requêtes commençant par /socket.io, IISNode doit communiquer à IIS que cellesci doivent également être
gérées par IISNode et ne sont pas uniquement des requêtes de fichiers statiques ou autre trafic. Cela nécessite un <handler> différent de celui des
applications IISNode standard.
<gestionnaires>
<add name="iisnodesocketio" path="server.js" verb="*" modules="iisnode" />
</gestionnaires>
En plus des modifications apportées aux <handlers>, nous devons également ajouter une règle de réécriture d'URL supplémentaire. La règle de
réécriture envoie tout le trafic /socket.io vers notre fichier serveur sur lequel le serveur Socket.io est exécuté.
Si vous utilisez IIS 8, vous devrez désactiver votre paramètre webSockets dans votre Web.config en plus d'ajouter le gestionnaire cidessus et les
règles de réécriture. Ceci n'est pas nécessaire dans IIS 7 puisqu'il n'y a pas de support webSocket.
Chapitre 41 : CLI
Section 41.1 : Options de ligne de commande
v, version
h, aide
Ajouté dans : v0.1.3 Options de ligne de commande du nœud d'impression. Le résultat de cette option est moins détaillé que ce document.
Ajouté dans : v0.5.2 Évaluez l'argument suivant en tant que JavaScript. Les modules prédéfinis dans le REPL peuvent également être utilisés en script.
c, vérifier
i, interactif
Ajouté dans : v0.7.7 Ouvre le REPL même si stdin ne semble pas être un terminal.
Suit les règles de résolution du module require(). module peut être soit un chemin d'accès à un fichier, soit un nom de module de nœud.
pas de dépréciation
tracedépréciation
Ajouté dans : v0.8.0 Imprimer les traces de pile pour les dépréciations.
lancerdépréciation
pas d'avertissements
Ajouté dans : v6.0.0 Faites taire tous les avertissements de processus (y compris les dépréciations).
traceavertissements
Ajouté dans : v6.0.0 Imprimer les traces de pile pour les avertissements de processus (y compris les dépréciations).
tracesyncio
Ajouté dans : v2.1.0 Imprime une trace de pile chaque fois que des E/S synchrones sont détectées après le premier tour de la boucle d'événements.
zerofillbuffers
Ajouté dans : v6.0.0 Remplit automatiquement à zéro toutes les instances Buffer et SlowBuffer nouvellement allouées.
preservesymlinks
Ajouté dans : v6.3.0 Demande au chargeur de module de conserver les liens symboliques lors de la résolution et de la mise en cache des modules.
Par défaut, lorsque Node.js charge un module à partir d'un chemin qui est symboliquement lié à un emplacement différent sur le disque, Node.js déréférencera
le lien et utilisera le "chemin réel" réel du module sur le disque comme identifiant. et comme chemin racine pour localiser d'autres modules de dépendance. Dans la
plupart des cas, ce comportement par défaut est acceptable. Cependant, lors de l'utilisation de dépendances homologues liées symboliquement, comme illustré
dans l'exemple cidessous, le comportement par défaut provoque la levée d'une exception si moduleA tente d'exiger moduleB comme dépendance homologue :
{appDir}
├──
app │ ├── index.js
│ └── node_modules │
├── moduleA > {appDir}/moduleA │ └── moduleB
│ ├── index.js │
package.json └ ── moduleA
└──
├── index.js
└──
package.json
L'indicateur de ligne de commande preservesymlinks demande à Node.js d'utiliser le chemin du lien symbolique pour les modules par opposition au chemin réel,
Notez cependant que l'utilisation de preservesymlinks peut avoir d'autres effets secondaires. Plus précisément, les modules natifs liés symboliquement peuvent
ne pas se charger s'ils sont liés à partir de plusieurs emplacements dans l'arborescence des dépendances (Node.js les verrait comme deux modules distincts et
trackheapobjets
Ajouté dans : v2.4.0 Suivez les allocations d'objets de tas pour les instantanés de tas.
profprocessus
Ajouté dans : v6.0.0 Traiter la sortie du profileur v8 générée à l'aide de l'option v8 prof.
v8options
Remarque : les options v8 permettent de séparer les mots par des tirets () ou des traits de soulignement (_).
tlscipherlist=liste
Ajouté dans : v4.0.0 Spécifiez une autre liste de chiffrement TLS par défaut. (Nécessite que Node.js soit construit avec la prise en charge du chiffrement.
(Défaut))
enablefips
Ajouté dans : v6.0.0 Activer le chiffrement compatible FIPS au démarrage. (Nécessite que Node.js soit construit avec ./configure opensslfips)
forcefips
Ajouté dans : v6.0.0 Forcer le chiffrement conforme à FIPS au démarrage. (Ne peut pas être désactivé à partir du code de script.) (Mêmes exigences que enablefips)
icudatadir=fichier
Ajouté dans : v0.11.15 Spécifiez le chemin de chargement des données ICU. (remplace NODE_ICU_DATA)
Variables d'environnement
NODE_DEBUG=module[,…]
Ajouté dans : v0.1.32, liste séparée par ',' des modules de base qui doivent imprimer les informations de débogage.
NODE_PATH=chemin[:…]
Ajouté dans : v0.1.32 ':' liste de répertoires séparés avec préfixe au chemin de recherche du module.
Remarque : sous Windows, il s'agit plutôt d'une liste séparée par des points ;
NODE_DISABLE_COLORS=1
Ajouté dans : v0.3.0 Lorsqu'elles sont définies sur 1, les couleurs ne seront pas utilisées dans le REPL.
NODE_ICU_DATA=fichier
Ajouté dans : v0.11.15 Chemin de données pour les données ICU (objet international). Étendra les données liées une fois compilées avec le support smallicu.
NODE_REPL_HISTORY=fichier
Ajouté dans : v5.0.0 Chemin d'accès au fichier utilisé pour stocker l'historique REPL persistant. Le chemin par défaut est ~/.node_repl_history, qui est remplacé par cette
variable. La définition de la valeur sur une chaîne vide ("" ou " ") désactive l'historique REPL persistant.
Exprimer
var express = require('express'); var app
= express();
app.listen(3000, function ()
{ console.log('Exemple d'application écoutant sur le port
3000 !'); });
Koa
app.use(function *()
{ this.body = 'Hello World'; });
app.écouter (3000);
Commandant.js
var programme = require('commander');
programme .version('0.0.1')
programme .command('au
revoir [nom]') .description('initialiser la configuration du
projet') .action(function(nom)
{ console.log('Au revoir +' nom + '. C'était un plaisir de te voir!');
});
programme .command('*')
.action(function(env)
{ console.log('Entrez une commande valide');
terminate(true);
});
programme.parse(process.argv);
Vorpal.js
const vorpal = require('vorpal')();
Chapitre 43 : grognement
Pour commencer, vous devez installer l'interface de ligne de commande (CLI) de Grunt globalement.
Préparation d'un nouveau projet Grunt : une configuration typique impliquera l'ajout de deux fichiers à votre projet : package.json et le Gruntfile.
package.json : ce fichier est utilisé par npm pour stocker les métadonnées des projets publiés sous forme de modules npm. Vous listerez Grunt et
les plugins Grunt dont votre projet a besoin en tant que devDependencies dans ce fichier.
Gruntfile : Ce fichier s'appelle Gruntfile.js et est utilisé pour configurer ou définir des tâches et charger des plugins Grunt.
Exemple de package.json :
{
"name": "nomdemonprojet",
"version": "0.1.0",
"devDependencies":
{ "grunt": "~0.4.5",
"gruntcontribjshint": "~0.10. 0", "grunt
contribnodeunit": "~0.4.1", "gruntcontrib
uglify": "~0.5.0"
}
}
//Configuration du projet.
grognement.initConfig({
pkg : grunt.file.readJSON('package.json'), uglify :
{ options :
{ bannière : '/
* ! <%= pkg.name %> <%= grunt.template.today("aaaammjj") %> */\n' }, build : { src: 'src/<%=
pkg.name
%> .js', destination : 'build/<%=
pkg.name %>.min.js'
}
} });
};
Ajout de dépendance
Pour utiliser un gruntplugin, vous devez d'abord l'ajouter en tant que dépendance à votre projet. Utilisons le plugin jshint comme exemple.
L' option savedev est utilisée pour ajouter le plugin dans le package.json, de cette façon, le plugin est toujours installé après une
installation npm .
Chargement du plugin
Vous pouvez charger votre plugin dans le fichier gruntfile en utilisant loadNpmTasks.
grunt.loadNpmTasks('gruntcontribjshint');
Configuration de la tâche
Vous configurez la tâche dans le fichier grunt en ajoutant une propriété appelée jshint à l'objet transmis à grunt.initConfig.
grunt.initConfig({ jshint :
{ all :
['Gruntfile.js', 'lib/**/*.js', 'test/**/*.js']
} });
N'oubliez pas que vous pouvez avoir d'autres propriétés pour les autres plugins que vous utilisez.
Exécuter la tâche
Pour exécuter simplement la tâche avec le plugin, vous pouvez utiliser la ligne de commande.
grognement jshint
grunt.registerTask('default', ['jshint']);
La tâche par défaut s'exécute avec la commande grunt dans le terminal sans aucune option.
"dépendances":
{ "ws": "*"
},
var ws = require('ws');
Chapitre 45 : forgeron
Section 45.1 : Créer un blog simple
En supposant que node et npm soient installés et disponibles, créez un dossier de projet avec un package.json valide.
Installez les dépendances nécessaires :
Créez un fichier appelé build.js à la racine de votre dossier de projet, contenant les éléments suivants :
Créez un dossier appelé src à la racine de votre dossier de projet. Créez index.html dans src, contenant les éléments suivants :
titre : Mon super blog
{{ titre }}
L’exécution de node build.js construira désormais tous les fichiers dans src. Après avoir exécuté cette commande, vous aurez index.html
dans votre dossier de build, avec le contenu suivant :
options.parse(process.argv);
if (!options.args.length) options.help();
fonction doConvert(options){
//faire quelque chose avec options.inFile et options.outFile
};
options .option("v,
verbose") .parse(process.argv);
if (options.verbose)
{ console.log("Faisons du bruit !");
}
jQuery et Jade
//'client.jade'
//chargement de jQuery ; cela peut également être fait à partir d'une source en ligne
script(src='./js/jquery2.2.0.min.js')
//test : le texte entre parenthèses doit apparaître en cliquant sur ledit bouton //window.alert('Vous
avez cliqué sur moi. jQuery');
//en cas de succès, les données reçues sont utilisées comme « données » pour
la fonction d'entrée réussie :
function (data) { window.alert('Demande envoyée ; données reçues.');
//si le membre 'nick' du JSON n'est pas égal à la chaîne prédéclarée (telle qu'elle a été initialisée),
alors le script backend a été exécuté, ce qui signifie que la communication a été établie
if(data.Nick != prédéclaré){
document.getElementById("modify").innerHTML = "JSON modifié !\n" +
jsonstr;
};
}
});
}); });
//'domaintest_route.js'
//un routeur Express écoutant les requêtes GET dans ce cas, il est vide, ce qui signifie que rien ne s'affiche lorsque vous
atteignez 'localhost/domaintest' router.get('/', function(req,
res, next) { });
// idem pour les requêtes POST remarquez comment la requête AJAX cidessus a été définie comme
POST router.post('/', function(req, res) {
res.setHeader('ContentType', 'application/json');
res.send(sent_data);
});
module.exports = routeur ;
Créez des modules petits et à usage unique, non seulement en termes de taille de code, mais également en termes de portée qui sert un seul objectif.
but
Le modèle de réacteur
Le modèle Reactor est au cœur de la nature asynchrone de node.js. Permet au système d'être implémenté en tant que processus
monothread avec une série de générateurs d'événements et de gestionnaires d'événements, à l'aide d'une boucle d'événements qui
s'exécute en continu.
} eventEmitter.on('doorOpen', ringBell);
eventEmitter.emit('doorOpen');
db.close();
});
myNewDB est le nom de la base de données, s'il n'existe pas dans la base de données, il sera créé automatiquement avec cet appel.
Remarque : il s'agit d'un exemple "prêt à fonctionner". N'oubliez pas d'obtenir jQuery et d'installer les modules requis.
Structure du projet :
projet
│ package.json
│ index.html │
├───js
main.js
jquery1.12.0.min.js
│ │ │ └───srv
│ app.js
├─── modèles
│ tâche.js
└─── tâches
processeur de données.js
app.js :
varTâche _ = require('./models/tâche');
app.use(express.static(__dirname + '/../'));
t.save(fonction(erreur, tâche){
//crée une nouvelle instance de nœud pour exécuter une tâche distincte dans un autre thread
taskProcessor = childProcess.fork('./srv/tasks/dataprocessor.js');
task.save(); }.bind(this));
taskProcessor.send(params);
réponse.status(200).json(tâche);
});
});
mangouste.connect('mongodb://localhost/test');
http.écouter('1234');
tâche.js :
mangouste.model('Tâche', taskSchema);
module.exports = mangouste.model('Tâche');
processeur de données.js :
{ processData(msg.message); }.bind(this)();
function processData(message){ //
envoyer la mise à jour du statut à l'application
principale process.send({ status: 'Nous avons commencé à traiter vos données.' });
// calculs longs ..
setTimeout(function()
{ process.send({ status: 'Done!' });
process.on('uncaughtException',function(err)
{ console.log("Une erreur s'est produite : " + err.message + "\n" + err.stack + ".\n"); console.log("
Terminer gracieusement la routine.");
});
index.html :
<!DOCTYPEhtml>
<html>
<head>
<script src="./js/jquery1.12.0.min.js"></script> <script src="./js/
main.js"></script> </head> < body> <p>Exemple
de
<br />
<p>Journal :</
p> <textarea id="log" rows="20" cols="50"></textarea> </body> </
html>
main.js :
$(document).on('prêt', fonction(){
$('#go').on('cliquez', function(e){
//effacer le
journal $("#log").val('');
.done(function(response){ $
("#log").val( $("#log").val() + '\n' + réponse.status);
});
});
package.json :
{
"name": "nodeProcessor",
"dependencies":
{ "bodyparser": "^1.15.2",
"express": "^4.14.0", "html":
"0.0.10", "mongoose" :
"^4.5.5"
}
}
Avertissement : cet exemple est destiné à vous donner une idée de base. Pour l'utiliser dans un environnement de production, il nécessite
des améliorations.
Section 51.1 : Envoyer une notification Web à l'aide de GCM (Google Cloud Messaging
System)
Un tel exemple est largement répandu parmi les PWA (Progressive Web Applications) et dans cet exemple, nous allons envoyer une simple notification de
4. Saisissez votre identifiant d'application GCM (nous en aurons besoin plus tard)
« utiliser strict » ;
}
});
}
})
});
module.exports = application
PS : j'utilise ici un hack spécial afin de faire fonctionner Socket.io avec Express car tout simplement cela ne fonctionne pas en dehors des sentiers
battus.
Créez maintenant un fichier .json et nommezle : Manifest.json, ouvrezle et collez ce qui suit :
{
"name": "Nom de l'application",
"gcm_sender_id": "ID du projet GCM"
}
PS : le fichier Manifest.json doit être dans le répertoire racine sinon il ne fonctionnera pas.
1. J'ai configuré et envoyé une page index.html normale qui utilisera également socket.io.
2. J'écoute un événement de connexion déclenché depuis le frontend, c'estàdire ma page index.html (il sera déclenché une fois par jour).
3. J'envoie un jeton spécial connu comme jeton d'enregistrement de mon index.html via l'événement socket.io new_user , ce jeton sera le code d'accès
unique de notre utilisateur et chaque code est généralement généré à partir d'un navigateur prenant en charge l' API de notification Web ( en savoir
plus ici.
4. J'utilise simplement le module nodegcm pour envoyer ma notification qui sera traitée et affichée plus tard à l'aide de Service Workers`.
C'est du point de vue de NodeJS . dans d'autres exemples, je montrerai comment nous pouvons envoyer des données personnalisées, des icônes ..etc dans
Ensuite, vous configurez la cible de débogage distant dans votre IDE spécifique.
Une fois ceuxci configurés, exécutez simplement la cible de débogage comme vous le feriez normalement et elle s'arrêtera sur vos points d'arrêt.
package.json
"dépendances":
{ "mangouste": "^4.5.5",
}
serveur.js (ECMA 6)
mongoose.connect('mongodb://localhost:27017/stackoverflowexample'); const db =
mangouste.connection; db.on('erreur',
console.error.bind(console, 'Erreur de connexion à la base de données !'));
mongoose.connect('mongodb://localhost:27017/stackoverflowexample'); var db =
mangouste.connection; db.on('erreur',
console.error.bind(console, 'Erreur de connexion à la base de données !'));
app/models/user.js (ECMA 6)
module.exports = Utilisateur
ECMA5.1 :
User.findOne
( { nom : 'stack' } ,
(err , user ) => { if (err )
throw err ;
if ( !user )
{ console.log ('Aucun utilisateur n'a été
trouvé' ) ; }
else { console.log ("L'utilisateur a été trouvé" ) ;
}
});
ECMA5.1 :
User.findOne
( { nom : 'stack'
} , function (err , user ) { if (err )
throw err ;
if ( !user )
{ console.log ('Aucun utilisateur n'a été
trouvé' ) ; }
else { console.log ("L'utilisateur a été trouvé" ) ;
}
});
//Connectezvous à la base de
données Mongo mongoose.connect(config.getDBString());
//Démarrez le serveur
app.listen(config.PORT);
console.log('Le serveur a démarré à '+ config.URL+ ":" +config.PORT);
config.js : ce fichier gérera tous les paramètres liés à la configuration qui resteront les mêmes tout au long.
var config =
{ VERSION : 1,
/*
* Obtenez la chaîne de connexion DB pour vous connecter à la base de données MongoDB
*/
getDBString : fonction(){
return 'mongodb://'+ this.DB.HOST +':'+ this.DB.PORT +'/'+ this.DB.DATABASE;
},
/*
* Obtenez l'URL http
module.exports = config;
//Schéma pour
l'utilisateur var UserSchema = new
Schema({ name :
{ type : String, obligatoire : true
// }, email :
{ tapez : chaîne
},
mot de passe :
{ type : Chaîne, //
obligatoire : vrai
},
dob :
{ type : Date, //
obligatoire : vrai
},
genre :
{ type : Chaîne, // Homme/Femme
// } obligatoire : vrai
});
//Créer un utilisateur
create: function(req, res){ var
repassword = req.body.repassword; var mot de
passe = req.body.password; var userEmail
= req.body.email;
} autre
{
//Nouveau courriel
//Créer un
utilisateur var user = new
User(); nom d'utilisateur =
req.body.name ; utilisateur.email =
req.body.email; user.password =
passwordHash ; utilisateur.dob = Date.parse(req.body.dob)
|| "" ; utilisateur.gender = req.body.gender;
//Valider l'utilisateur
user.validate(function(err){ if(err)
{ res.json(err); return; }
else{ //
Enfin
enregistrer l'utilisateur
user.save(function(err){ if(err) {
res.json(err);
retour;
}
module.exports = UserController ;
router.route('/
users') .post(UserController.create);
routeur de retour ;
module.exports = UserRoutes ;
L'exemple cidessus peut sembler trop gros, mais si un débutant sur node.js avec un petit mélange de connaissances expresses
essaie de suivre cela, il le trouvera facile et vraiment utile.
Mauvaise façon :
Router.route('/') .get((req,
res) => { Request.find((err,
r) => { if(err){ console.log(err) } else
{ res.json(r )
{ res.json({ message : 'une erreur s'est produite lors de l'enregistrement de votre r' }); }
else
{ res.json(r);
} }); });
Meilleure façon:
Router.route('/') .get((req,
res) => { Request.find((err,
r) => { if(err){ console.log(err) } else
{ return
next(err)
res.json(r);
} }); });
racine du projet
server.js | |
____vues |
index.html |
page1.html
serveur.js
app.listen(8080);
Notez que sendFile() diffuse simplement un fichier statique en réponse, n'offrant aucune possibilité de le modifier. Si vous diffusez un fichier HTML
et souhaitez y inclure des données dynamiques, vous devrez alors utiliser un moteur de modèle tel que Pug, Moustache ou EJS.