Это зависит от причины, по которой вы готовы выйти из процесса node.js, но в любом случае process.exit()
является последним вариантом для рассмотрения . Цитата из документации:
Важно отметить, что вызов process.exit()
вызовет
процесс выхода как можно быстрее, даже если еще есть
ожидающие асинхронные операции, которые еще не завершены полностью,
включая операции ввода / вывода до process.stdout
и process.stderr
.
В большинстве случаев на самом деле нет необходимости звонить
process.exit()
явно. Процесс Node.js завершится самостоятельно
если нет дополнительной работы, ожидающей в цикле событий.
process.exitCode
свойство может быть установлено, чтобы сообщить процессу, какой выход
код, используемый при корректном завершении процесса.
Давайте рассмотрим возможные причины, по которым вы можете выйти из процесса node.js и почему вам следует избегать process.exit()
:
Случай 1 - Выполнение завершено (сценарий командной строки)
Если сценарий достиг своего конца и интерпретатор узла не завершился, это означает, что некоторые асинхронные операции все еще ожидают выполнения. На данном этапе неправильно принудительно завершать процесс с помощью process.exit()
. Лучше попытаться понять , что удерживает ваш скрипт от ожидаемого выхода . И когда вы решите это, вы можете использовать process.exitCode
, чтобы вернуть любой результат вызывающему процессу.
Случай 2 - Завершение из-за внешнего сигнала (SIGINT / SIGTERM / другое)
Например, если вы хотите аккуратно закрыть приложение express . В отличие от сценария командной строки, приложение Express продолжает работать бесконечно, ожидая новых запросов. process.exit()
будет плохим вариантом, потому что он будет прерывать все запросы, находящиеся в конвейере. И некоторые из них могут быть неидемпотентными (ОБНОВЛЕНИЕ, УДАЛЕНИЕ). Клиент никогда не узнает, выполнены ли эти запросы на стороне сервера или нет, и это может быть причиной несоответствия данных между клиентом и сервером. Единственное хорошее решение - сообщить http-серверу прекратить прием новых запросов и дождаться, пока ожидающие завершат работу с 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");
});
});
Если он все еще не выходит - см. Случай 1.
Случай 3 - Внутренняя ошибка
Всегда лучше throw
сообщать об ошибке, вы получите красиво отформатированную трассировку стека и сообщение об ошибке. Верхние уровни кода всегда могут решить, могут ли они обработать ошибку (catch
) или позволить ей завершить процесс. С другой стороны, process.exit(1)
прервет процесс молча, и у него не будет возможности восстановиться после этого. Это может быть единственным «преимуществом» process.exit()
, вы можете быть уверены, что процесс будет остановлен.