449 Stimmen

Führen einer Bereinigungsaktion kurz bevor Node.js beendet wird

Ich möchte Node.js sagen, dass es immer etwas tun soll, kurz bevor es beendet wird, aus welchem Grund auch immer — Strg+C, eine Ausnahme oder aus einem anderen Grund.

Ich habe dies versucht:

process.on('exit', function (){
    console.log('Auf Wiedersehen!');
});

Ich habe den Prozess gestartet, ihn beendet und es ist nichts passiert. Ich habe ihn erneut gestartet, Strg+C gedrückt und es passierte immer noch nichts...

1 Stimmen

10voto

Cory Danielson Punkte 13816

async-exit-hook scheint die aktuellste Lösung für dieses Problem zu sein. Es handelt sich um eine abgespaltene/neu geschriebene Version von exit-hook, die asynchronen Code vor dem Beenden unterstützt.

1 Stimmen

Ich habe am Ende diese Bibliothek benutzt, da sie es mir ermöglichte, Timeouts zu verwenden, was ich brauchte, um gracefully zu stoppen.

9voto

gorodezkiy Punkte 3009

Nur erwähnen möchten wir hier das Death-Paket: https://github.com/jprichardson/node-death

Beispiel:

var ON_DEATH = require('death')({uncaughtException: true}); //das ist absichtlich hässlich

ON_DEATH(function(signal, err) {
  //Hier Bereinigungscode einfügen
})

0 Stimmen

Es scheint, dass du das Programm explizit mit process.exit() innerhalb des Rückrufs beenden musst. Das hat mich durcheinander gebracht.

5voto

BlackGlory Punkte 3627

Ich muss eine asynchrone Aufräumaktion beim Beenden durchführen, keines der Antworten in dieser Frage hat für mich funktioniert.

Also habe ich es selbst versucht und schließlich dies gefunden:

process.once('uncaughtException', async () => {
  await cleanup()

  process.exit(0)
})

process.once('SIGINT', () => { throw new Error() })

1voto

Le Hieu Punkte 11

Nachdem ich mit anderen Antworten herumgespielt habe, ist hier meine Lösung für diese Aufgabe. Wenn ich es auf diese Weise implementiere, hilft es mir, die Bereinigung an einer Stelle zu zentralisieren und doppelte Bereinigung zu vermeiden.

  1. Ich möchte alle anderen vorhandenen Codes zum 'exit' Code routen.

    const others = [SIGINT, SIGUSR1, SIGUSR2, uncaughtException, SIGTERM] others.forEach((eventType) => { process.on(eventType, exitRouter.bind(null, { exit: true })); })

  2. Was der exitRouter macht, ist process.exit() aufrufen.

    Funktion exitRouter(Optionen, exitCode) { if (exitCode || exitCode === 0) console.log(ExitCode ${exitCode}); if (Optionen.exit) process.exit(); }

  3. Bei 'exit' die Bereinigung mit einer neuen Funktion behandeln

    Funktion exitHandler(exitCode) { console.log(ExitCode ${exitCode}); console.log('Endlich beendet...') }

    process.on('exit', exitHandler)

Zum Demonstrieren, das ist der Link zu meinem Gist. In der Datei habe ich ein setTimeout hinzugefügt, um den Prozess zu simulieren.

Wenn Sie node node-exit-demo.js ausführen und nichts tun, sehen Sie nach 2 Sekunden das Protokoll:

Der Dienst ist nach einer Weile beendet.
ExitCode 0
Endlich beendet...

Wenn Sie jedoch vor Abschluss des Dienstes durch Strg+C beenden, sehen Sie:

^CAusgangscode SIGINT
ExitCode 0
Endlich beendet...

Was passiert ist, dass der Node-Prozess ursprünglich mit dem Code SIGINT beendet wurde, dann zu process.exit() geroutet wurde und schließlich mit Exit-Code 0 beendet wurde.

0voto

Golo Roden Punkte 125652

io.js hat ein exit und ein beforeExit Ereignis, die das tun, was du willst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X