Comment utiliser le module de processus global en Node.js

Quels sont les processus globaux utiles en Node.js et comment s'en servir ? Une traduction de l'article How to use the global process module

Classé dans Pour commencer

Traduction

Chaque processus Node.js dispose d'un ensemble de fonctionnalités intégrées, accessibles via le module de processus global. Le module de processus n'a pas besoin d'être utilisé ; il s'agit littéralement d'une enveloppe autour du processus en cours d'exécution, et beaucoup des méthodes qu'il expose sont en fait des enveloppes autour des appels dans les bibliothèques C de base.

Événements

Il y a deux événements intégrés à noter dans le module de processus, exit et uncaughtException.

L'événement exit se déclenche lorsque le processus est sur le point de se terminer.

process.on('exit', function () {
  fs.writeFileSync('/tmp/myfile', 'Ceci DOIT être sauvé lorsque le programme se termine.');
});

Un code comme celui ci-dessus peut parfois être utile pour sauvegarder une sorte de rapport final avant de quitter. Notez l'utilisation d'un appel de système de fichiers synchrone ; cela permet de s'assurer que les entrées/sorties ou E/S (I/O) se terminent avant que le processus ne se termine réellement.

L'autre événement intégré s'appelle uncaughtException. Il se déclenche, comme vous pouvez le deviner, chaque fois qu'une exception se produit qui n'a pas été attrapée ou traitée ailleurs dans votre programme. Ce n'est pas la façon idéale de gérer les erreurs, mais cela peut être très utile comme dernière ligne de défense si un programme doit continuer à fonctionner indéfiniment.

process.on('uncaughtException', function (err) {
  console.error('Une erreur non gérée vient de se produire !');
  console.error(err.stack);
});

Le comportement par défaut de uncaughtException est d'imprimer une trace de la pile et de sortir ; en utilisant ce qui précède, votre programme affichera le message fourni et la trace de la pile, mais ne sortira pas.

Flux de données séquencé

L'objet processus fournit également des enveloppes pour les trois flux de données standard (STDIO), les entrées stdin, les sorties stdout et les erreurs stderr. En bref, stdin est un flux de lecture (où l'on peut lire les entrées de l'utilisateur), stdout est un flux d'écriture non-bloquant (les écritures vers stdout sont asynchrones), et stderr est un flux d'écriture bloquant (synchrone).

Le plus simple à décrire est process.stdout. Techniquement, la plupart des sorties dans Node.js sont accomplies en utilisant process.stdout.write() ; bien que la plupart des gens ne le sauront jamais. Ce qui suit est tiré de console.js dans le noyau de Node.js :

exports.log = function() {
  process.stdout.write(format.apply(this, arguments) + '\n');
};

Comme la plupart des gens sont habitués à la syntaxe console.log dans le cadre du développement d'un navigateur, elle a été fournie comme enveloppe pratique.

Ensuite, nous avons process.stderr, qui est très similaire à process.stdout à une exception près : il se bloque. Lorsque vous écrivez sur stderr, votre processus se bloque jusqu'à ce que l'écriture soit terminée. Node.js fournit un certain nombre d'alias pour la sortie, dont la plupart finissent par utiliser stdout ou stderr sous le capot. Voici une liste de référence rapide :

STDOUT, ou fonctions non bloquantes : console.log, console.info, util.puts, util.print.

STDERR, ou fonctions bloquantes : console.warn, console.error, util.debug.

Enfin, process.stdin est un flux de lecture permettant de récupérer les entrées de l'utilisateur. En savoir plus.

Autres propriétés

L'objet processus contient en complément une variété de propriétés qui vous permettent d'accéder à des informations sur le processus en cours. Examinons quelques exemples rapides à l'aide de Node.js REPL pour boucle de lecture–évaluation–impression, c.-à-d. par invité de commande :

> process.pid
3290
> process.version
'v0.4.9'
> process.platform
'linux'
> process.title
'node'

Le pid est l'identifiant du processus de votre système d'exploitation (OS Process ID), le plateform est quelque chose de généraliste comme 'linux' ou 'darwin', et le version se réfère à votre version de Node.js. process.title est un peu différent ; bien que renvoyant node par défaut, il peut être défini à ce que vous voulez, et sera ce qui est affiché dans les listes de processus en cours d'exécution.

Le module process expose également process.argv, un tableau contenant les arguments de la ligne de commande pour le processus actuel, et process.argc, un entier représentant le nombre d'arguments passés. En savoir plus sur les entrées CLI.

process.execPath renvoie le chemin absolu de l'exécutable qui a démarré ce processus.

process.env contient vos variables d'environnement. Essayez process.env.HOME, par exemple.

Méthodes

Il existe également une variété de méthodes attachées à l'objet processus, dont beaucoup traitent d'aspects assez avancés d'un programme. Nous allons jeter un coup d'oeil à quelques-unes des méthodes les plus couramment utilisées, tout en laissant les parties plus avancées pour d'autres articles.

process.exit quitte le processus. Si vous appelez une fonction asynchrone et que vous appelez process.exit() immédiatement après, vous serez dans une situation d'appel concurrant en parallèle ; l'appel asynchrone peut ou non se terminer avant que le processus ne soit quitté. process.exit accepte un argument optionnel - un code de sortie entier. 0, par convention, est une sortie sans erreur.

process.cwd renvoie le “répertoire de travail actuel” du processus ; c'est souvent le répertoire à partir duquel la commande de démarrage du processus a été lancée.

process.chdir est utilisé pour changer le répertoire de travail actuel. Par exemple :

> process.cwd()
'/home/avian/dev'
> process.chdir('/home/avian')
> process.cwd()
'/home/avian'

Enfin, sur une note plus avancée, nous avons process.nextTick. Cette méthode accepte en argument une fonction de rappel (callback function) et l'exécutera au début de la prochaine itération de la boucle d'événement. Certaines personnes font quelque chose comme ça :

setTimeout(function () {
  // code here
}, 0)

Cependant, ce n'est pas l'idéal. En Node.js, il faut plutôt utiliser ceci :

process.nextTick(function () {
  console.log('Prochain arrêt sur la boucle d'événement, wheeee !')
});

Il est beaucoup plus efficace, et beaucoup plus précis.

Lire dans une autre langue