Недавно я занимался закрытием проекта, написанного на Node.js. Хотя это и не сложно, я хотел найти лучшую альтернативу обычному способу. Обычно у нас есть некоторые модули, которые нам нужно очистить в определенном порядке, и эти модули предоставят нам некоторые функции для этого. Эти функции часто являются асинхронными или генерируют событие/принимают функцию обратного вызова, когда они закрыты. Мы можем прослушивать такие сигналы, как SIGINT и SIGKILL, с помощью process.on()и делать все необходимое, прежде чем вызывать process.exit() для завершения процесса.

Обычный способ сделать это, который часто рекомендуют в Интернете, обычно выглядит примерно так:

Когда наш Node-процесс получает сигнал SIGINT, мы закрываем наш сервер. Функция close нашего сервера принимает функцию в качестве аргумента и вызывает ее, когда сервер генерирует событие closed (мы могли бы добиться того же с помощью server.on('close', () => …). Наша база данных также предоставляет функцию close, и она является асинхронной. Когда обещание разрешается, мы можем закончить процесс с process.exit.

Мы можем легко улучшить это несколькими способами. Во-первых, мы можем использовать async/await, чтобы дождаться закрытия нашей базы данных, прежде чем делать что-либо еще, что нам нужно сделать, и выйти. Однако мы все еще застряли с этим server.close, но мы можем воспользоваться библиотекой событий Node, чтобы превратить это в обещание и также ожидать его. Конечный результат намного приятнее и управляемее.

Я надеюсь, что это дало вам некоторые идеи о демонтаже проектов Node. Буду рад услышать о любых альтернативах, улучшениях или вопросах, о которых вы можете подумать.