J'ai essayé d'effectuer une opération asynchrone avant la fin de mon processus.
Dire "résilié" signifie toutes les possibilités de résiliation:
ctrl+c
À ma connaissance, l'événement exit
fait cela mais pour les opérations synchrones.
En lisant les documents Nodejs, j'ai trouvé l'événement beforeExit
est pour les opérations asynchrones MAIS:
L'événement 'beforeExit' n'est pas émis pour les conditions provoquant une terminaison explicite, telles que l'appel de
process.exit()
ou des exceptions non interceptées.L'événement 'beforeExit' ne doit pas être utilisé comme alternative à l'événement 'exit' sauf si l'intention est de planifier des travaux supplémentaires.
Aucune suggestion?
Vous pouvez intercepter les signaux et effectuer votre tâche asynchrone avant de quitter. Quelque chose comme ça appellera la fonction terminator () avant de quitter (même erreur javascript dans le code):
process.on('exit', function () {
// Do some cleanup such as close db
if (db) {
db.close();
}
});
// catching signals and do something before exit
['SIGHUP', 'SIGINT', 'SIGQUIT', 'SIGILL', 'SIGTRAP', 'SIGABRT',
'SIGBUS', 'SIGFPE', 'SIGUSR1', 'SIGSEGV', 'SIGUSR2', 'SIGTERM'
].forEach(function (sig) {
process.on(sig, function () {
terminator(sig);
console.log('signal: ' + sig);
});
});
function terminator(sig) {
if (typeof sig === "string") {
// call your async task here and then call process.exit() after async task is done
myAsyncTaskBeforeExit(function() {
console.log('Received %s - terminating server app ...', sig);
process.exit(1);
});
}
console.log('Node server stopped.');
}
Ajouter le détail demandé dans le commentaire:
Utilisation du crochet beforeExit
L'événement "beforeExit" est émis lorsque Node.js vide sa boucle d'événements et n'a aucun travail supplémentaire à planifier. Normalement, le processus Node.js se termine lorsqu'aucun travail n'est planifié, mais un écouteur enregistré sur l'événement "beforeExit" peut effectuer des appels asynchrones et entraîner ainsi la poursuite du processus Node.js.
process.on('beforeExit', async () => {
await something()
process.exit(0) // if you don't close yourself this will run forever
});