Vraag Hoe te verlaten in Node.js


Wat is het commando dat wordt gebruikt om af te sluiten? (dit wil zeggen het proces node.js beëindigen)


1359
2018-03-10 21:30


oorsprong


antwoorden:


Roep de wereld op process voorwerpen exit methode:

process.exit()

Van de documenten:

process.exit ([code])

Beëindigt het proces met het opgegeven code. Indien weggelaten, gebruikt exit de 'succes'-code 0.

Om af te sluiten met een 'failure'-code:

process.exit(1);

De shell die het knooppunt heeft uitgevoerd, zou de exit-code als 1 moeten zien.


1693
2018-03-10 21:36



Van de ambtenaar nodejs.org documentatie:

process.exit(code)

Beëindigt het proces met de opgegeven code. Indien weggelaten, gebruikt exit de 'succes'-code 0.

Om af te sluiten met een 'failure'-code:

process.exit(1);

320
2018-03-22 18:48



Als u zich in een Unix-terminal of Windows-opdrachtregel bevindt en u de knooppunt-REPL wilt afsluiten, moet u ...

  • druk op Ctrl + C tweemaal, of
  • type .exit en druk op Enter of
  • druk op Ctrl + D aan het begin van een regel (alleen Unix)

236
2018-06-02 13:02



Gewoon een opmerking dat gebruik process.exit([number]) is niet aangeraden praktijk.

De reden dat dit problematisch is, is omdat het schrijft om te verwerken   Node.js zijn niet-blokkerend en kunnen optreden via meerdere tikken van de   Node.js-gebeurtenislus. Calling process.exit () forceert echter de   proces om af te sluiten voordat die extra schrijfacties naar stdout kunnen zijn   uitgevoerd.

In plaats van process.exit () rechtstreeks aan te roepen, moet de code de   process.exitCode en laat het proces op natuurlijke wijze afsluiten door te vermijden   meer werk plannen voor de gebeurtenislus:

Als dat het geval is, moet u de afsluitcode instellen en het knooppunt toestaan ​​om elegant af te sluiten:

process.exitCode = 1;

175
2017-07-06 05:52



Vanaf de opdrachtregel, .exit is wat je wilt:

$ node
> .exit
$

Het is gedocumenteerd in de REPL docs. REPL (Read-Eval-Print-Loop) is de opdrachtregel van het knooppunt.

Van een normaal programma gebruik process.exit([code]).


109
2017-10-29 16:51



Het hangt af van de reden waarom u bereid bent het proces node.js af te sluiten, maar in elk geval process.exit() is de laatste optie om te overwegen. Een citaat uit documentatie:

Het is belangrijk om op te merken dat bellen process.exit() zal de   proces om zo snel mogelijk af te sluiten, zelfs als er nog steeds sprake is van stilstand   asynchrone operaties in behandeling die nog niet volledig zijn voltooid,   inclusief I / O-bewerkingen naar process.stdout en process.stderr.

In de meeste situaties is het niet echt nodig om te bellen    process.exit() uitdrukkelijk. Het Node.js-proces wordt afgesloten op zijn eigen   als er geen extra werk in de gebeurtenislus in behandeling is. De    process.exitCode eigenschap kan worden ingesteld om het proces te vertellen dat afsluit   code die moet worden gebruikt wanneer het proces sierlijk wordt afgesloten.

Laten we mogelijke redenen bespreken waarom u bereid bent het proces node.js af te sluiten en waarom u dit moet vermijden process.exit():

Case 1 - Uitvoering voltooid (opdrachtregelscript)

Als het script zijn einde heeft bereikt en de knooppuntinterpreter niet wordt afgesloten, betekent dit dat sommige asynchrone bewerkingen nog steeds in behandeling zijn. Het is verkeerd om procesbeëindiging met te forceren process.exit() op dit punt. Het is beter om te proberen het te begrijpen wat je script tegenhoudt om op de verwachte manier te verlaten. En wanneer u dit afwikkelt, kunt u gebruiken process.exitCodeom een ​​resultaat terug te sturen naar het oproepproces.

Geval 2 - Beëindiging vanwege extern signaal (SIGINT / SIGTERM / overig)

Bijvoorbeeld als u bereid bent om een uitdrukken app. In tegenstelling tot het script van de opdrachtregel blijft de uitdrukkelijke app oneindig lopen, wachtend op nieuwe verzoeken. process.exit() zal hier een slechte optie zijn omdat het alle aanvragen die in pijplijn zitten zal onderbreken. En sommige van hen kunnen niet-idempotent zijn (UPDATE, DELETE). De klant zal nooit weten of deze aanvragen zijn voltooid of niet op de server en dit kan de oorzaak zijn van de inconsistentie van gegevens tussen client en server. De enige goede oplossing is om http-server te vertellen dat het stoppen met het accepteren van nieuwe verzoeken en wachten tot de wachtende zijn voltooid 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");
   });
});

Als het nog steeds niet wordt afgesloten - zie case 1.

Case 3 - Interne fout

Het is altijd beter om throw een foutmelding, dan krijg je een mooi opgemaakt stapeltracering en foutmelding. Bovenliggende codecoden kunnen altijd beslissen of ze met fouten kunnen omgaan (catch) of laat het proces crashen. Aan de andere kant, process.exit(1) beëindigt het proces stil en er is geen mogelijkheid om dit te herstellen. Het is misschien het enige "voordeel" van process.exit(), je kunt er zeker van zijn dat het proces wordt beëindigd.


55
2018-02-06 17:38



REPL(Opdrachtregel)

  • druk op ctrl + c  tweemaal

  • Type .exit en druk op enter

Script bestand

process.exit(code)

Knooppunt wordt normaliter afgesloten met code 0 wanneer er geen asynchrone bewerkingen meer in behandeling zijn.

process.exit(1) moet worden gebruikt om met een foutcode af te sluiten. Hiermee kunnen we concluderen dat het knooppunt niet sierlijk is gesloten en werd gedwongen te sluiten.

Er zijn nog andere exit-codes zoals

3 - Internal JavaScript Parse Error (zeer zeldzaam)

5 - Fatale fout in de v8 javascript-engine

9 - Ongeldig argument

Zie voor de volledige lijst knooppunt exit codes


22
2018-02-09 05:36



Ik heb een applicatie die ik wilde:

  1. Stuur een e-mail naar de gebruiker
  2. Sluit af met een foutcode

Ik moest aanhaken process.exit(code) aan een exit gebeurtenishandler, anders wordt de e-mail niet verzonden sinds het bellen process.exit(code) doodt direct asynchrone gebeurtenissen.

#!/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); });

12
2017-12-06 01:15



Van code die u kunt gebruiken process.exit([errorcode]) waar [errorcode] is een optioneel geheel getal (0 is de standaardinstelling om succes aan te geven).

Als u de Lees Eval Print Loop (REPL), je kunt gebruiken Ctrl + D, of typ .exit

Als alternatief kunt u op Windows of Linux gebruiken Ctrl + C, Ctrl + C

Op Mac is het commando Ctrl + Z, Ctrl + Z


6
2018-06-10 01:05



Zoals @Dominic opmerkt, het gooien van een niet-afgevangen fout is betere oefening in plaats van bellen process.exit ([code]):
process.exitCode = 1; throw new Error("my module xx condition failed");


6
2017-10-26 20:10



Verlaten

let exitCode = 1;
process.exit(exitCode)

Handige exit-codes

1 - Catchall voor algemene fouten
2 - Misbruik van shell-builtins (volgens Bash-documentatie)
126 - Het aangeroepen commando kan niet worden uitgevoerd
127 - "commando niet gevonden"
128 - Ongeldig argument om te verlaten
128 + n - Fataal foutsignaal "n"
130 - Script beëindigd door Control-C
255 \ * - Verlaat status buiten bereik

6
2017-12-19 15:55