Comment quitter dans Node.js




(10)

Quelle est la commande utilisée pour quitter? (c'est-à-dire terminer le processus node.js)


A partir du code, vous pouvez utiliser process.exit([errorcode]) code d' process.exit([errorcode])[errorcode] code d' [errorcode] est un entier optionnel ( 0 est la valeur par défaut pour indiquer le succès).

Si vous utilisez la boucle REPL (Read Eval Print Loop) , vous pouvez utiliser Ctrl + D ou tapez .exit

Sinon, sous Windows ou Linux, vous pouvez utiliser Ctrl + C , Ctrl + C

Sur Mac, la commande est Ctrl + Z , Ctrl + Z


Cela dépend de la raison pour laquelle vous êtes prêt à quitter le processus node.js, mais dans tous les cas, process.exit() est la dernière option à prendre en compte . Une citation de la documentation:

Il est important de noter que l'appel de process.exit() forcera le processus à quitter aussi rapidement que possible même si des opérations asynchrones en attente ne sont pas encore terminées, y compris les opérations d'E / S vers process.stdout et process.stderr .

Dans la plupart des cas, il n'est pas nécessaire d'appeler explicitement process.exit() . Le processus Node.js sortira par lui-même s'il n'y a pas de travail supplémentaire en attente dans la boucle d'événements. La propriété process.exitCode peut être définie pour indiquer au processus le code de sortie à utiliser lorsque le processus se termine normalement.

Couvrons les raisons possibles pour lesquelles vous pourriez vouloir quitter le processus node.js et pourquoi vous devriez éviter process.exit() :

Cas 1 - Exécution terminée (script de ligne de commande)

Si le script a atteint sa fin et que l'interpréteur de noeud ne se termine pas, cela indique que certaines opérations asynchrones sont toujours en attente. Il est incorrect de forcer la fin du processus avec process.exit() à ce stade. Il est préférable d'essayer de comprendre ce qui empêche votre script de s'exécuter de la manière attendue . Et lorsque vous réglez cela, vous pouvez utiliser process.exitCode pour renvoyer tout résultat au processus d'appel.

Cas 2 - Résiliation à cause d'un signal externe (SIGINT / SIGTERM / autre)

Par exemple, si vous êtes prêt à fermer gracieusement une application express . Contrairement au script de ligne de commande, l'application express continue de fonctionner à l'infini, en attendant de nouvelles demandes. process.exit() sera une mauvaise option ici car il va interrompre toutes les requêtes qui sont en pipeline. Et certains d'entre eux pourraient être non-idempotent (UPDATE, DELETE). Le client ne saura jamais si ces demandes sont terminées ou non côté serveur et cela peut être la raison de l'incohérence des données entre le client et le serveur. La seule bonne solution consiste à dire au serveur http d'arrêter d'accepter de nouvelles requêtes et d'attendre que celles en attente se terminent avec server.close() :

var express = require('express');
var app = express();
var server = app.listen(80);

process.on( 'SIGTERM', function () {
   server.close(function () {
     console.log("Finished all requests");
   });
});

S'il ne sort toujours pas - voir Cas 1.

Cas 3 - Erreur interne

Il est toujours préférable de throw une erreur, vous obtiendrez une trace de pile bien formatée et un message d'erreur. Les niveaux supérieurs de code peuvent toujours décider s'ils peuvent gérer l'erreur ( catch ) ou laisser le processus tomber en panne. De l'autre côté, process.exit(1) terminera le processus en silence et il n'y aura aucune chance de récupérer à partir de cela. C'est peut-être le seul "avantage" de process.exit() , vous pouvez être sûr que ce processus sera terminé.


De la documentation officielle nodejs.org :

process.exit(code)

Termine le processus avec le code spécifié. Si omis, exit utilise le code 'succès' 0.

Pour quitter avec un code 'échec':

process.exit(1);

De la ligne de commande, .exit est ce que vous voulez:

$ node
> .exit
$

Il est documenté dans les documents REPL . REPL (Read-Eval-Print-Loop) est ce que la ligne de commande Node est appelée.

À partir d'un programme normal, utilisez process.exit([code]) .


J'ai une application que je voulais:

  1. Envoyer un email à l'utilisateur
  2. Quitter avec un code d'erreur

J'ai dû raccorder process.exit(code) à un gestionnaire d'événement exit , sinon le courrier ne sera pas envoyé car l'appel à process.exit(code) tue directement les événements asynchrones.

#!/usr/bin/nodejs
var mailer = require('nodemailer');
var transport = mailer.createTransport();
mail = {
  to: 'Dave Bowman',
  from: 'HAL 9000',
  subject: 'Sorry Dave',
  html: 'Im sorry, Dave. Im afraid I cant do <B>THAT</B>.'
}
transport.sendMail(mail);
//process.exit(1);
process.on('exit', function() { process.exit(1); });

Juste une note que l'utilisation de process.exit([number]) n'est exit .

La raison pour laquelle cela est problématique est que les écritures dans process.stdout dans Node.js ne sont pas bloquantes et peuvent se produire sur plusieurs ticks de la boucle d'événements Node.js. L'appel de process.exit () force cependant le processus à se terminer avant que ces écritures supplémentaires puissent être effectuées sur stdout.

Plutôt que d'appeler directement process.exit (), le code doit définir process.exitCode et permettre au processus de se terminer naturellement en évitant de planifier tout travail supplémentaire pour la boucle d'événements:

Si vous le pouvez, vous devez définir le code de sortie et autoriser le noeud à quitter normalement:

process.exitCode = 1;

Si vous êtes dans un terminal Unix ou une ligne de commande Windows et que vous voulez quitter le Node REPL, soit ...

  • Appuyez deux fois sur Ctrl + C , ou
  • tapez .exit et appuyez sur Entrée, ou
  • appuyez sur Ctrl + D au début d'une ligne (Unix uniquement)

si vous voulez quitter l'application node js, alors écrivez

process.exit(1)

dans votre code


REPL (ligne de commande)

  • Appuyez deux fois sur ctrl + c

  • Tapez .exit et appuyez sur Entrée

Fichier de script

process.exit(code)

Le nœud se termine normalement avec le code 0 lorsqu'aucune autre opération asynchrone n'est en attente.

process.exit(1) devrait être utilisé pour sortir avec un code d'échec. Cela nous permettra d'inférer que le noeud ne s'est pas fermé normalement et a été forcé de se fermer.

Il existe d'autres codes de sortie

3 - Erreur d'analyse JavaScript interne (très très rare)

5 - Erreur fatale dans le moteur javascript v8

9 - Argument invalide

Pour la liste complète, voir les codes de sortie de noeud


Appelez la process de exit l'objet de process global:

process.exit()

De la docs:

process.exit ([code])

Termine le processus avec le code spécifié. Si omis, exit utilise le code 'succès' 0 .

Pour quitter avec un code 'échec':

process.exit(1);

Le shell qui a exécuté le noeud devrait voir le code de sortie 1.





node.js