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.
-
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 }));
})
-
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();
}
-
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.
1 Stimmen
Siehe github.com/nodejs/node/issues/20804