node js остановить выполнение скрипта
О завершении работы Node.js-процессов
Существует несколько способов намеренного завершения работы процесса. Среди них — следующие:
Операция | Пример |
Ручной выход из процесса | |
Неперехваченная ошибка | |
Необработанное отклонение промиса | |
Проигнорированное событие error | |
Необработанный сигнал |
Ручной выход из процесса
Этот Node.js-однострочник ничего в консоль не выведет. Правда, воспользовавшись возможностями командной оболочки, можно узнать статус завершения процесса. Пользователь программы, столкнувшись с тем, что она завершила работу подобным образом, не поймёт того, что произошло.
Теперь пользователю будут понятны причины остановки приложения. Пользователь запускает приложение, оно выдаёт ошибку в консоль, после чего пользователь принимает меры для исправления ситуации.
Стоит отметить, что метод process.exit() — это весьма мощный механизм. Хотя у него есть своё место в коде приложений, его категорически не рекомендуется использовать в библиотеках, рассчитанных на многократное использование. Если ошибка произошла в библиотеке, библиотека должна её выбросить. Это позволит приложению, использующему библиотеку, самостоятельно принять решение о том, как обрабатывать эту ошибку.
Исключения, отклонения промисов, выдача событий error
Экземпляры класса Error содержат метаданные, которые полезны в деле определения причины ошибки. Например — данные трассировки стека и строки с сообщениями об ошибке. Распространённой является практика построения на основе класса Error классов ошибок, рассчитанных на конкретное приложение. При этом одно лишь создание экземпляра класса Error не приводит к каким-то заметным последствиям. Экземпляр ошибки нужно не только создать, но и выбросить.
А вот пример того, что при выполнении подобного кода выводится в консоли:
Отклонённые промисы, в отличие от неперехваченных исключений, не приводят, в Node.js v14, к остановке процесса. В будущих версиях Node.js отклонённые промисы будут завершать работу процессов. Подобные события, как и в случае с событиями ошибок, можно перехватывать с помощью объекта process :
Сигналы
В разных операционных системах могут быть определены различные сигналы. Ниже приведён список сигналов, которые, по большей части, универсальны.
Имя | Код | Подлежит ли сигнал обработке | Стандартная реакция Node.js | Цель сигнала |
1 | Да | Завершение работы | Закрытие терминала | |
2 | Да | Завершение работы | Сигнал прерывания (Ctrl+C) с терминала | |
3 | Да | Завершение работы | Сигнал Quit с терминала (Ctrl+D) | |
9 | Нет | Завершение работы | Безусловное завершение процесса | |
10 | Да | Запуск отладчика | Пользовательский сигнал №1 | |
12 | Да | Завершение работы | Пользовательский сигнал №2 | |
15 | Да | Завершение работы | Запрос на завершение работы процесса | |
19 | Нет | Завершение работы | Остановка выполнения процесса |
Если в программе может быть реализован механизм обработки соответствующего сигнала — в столбце таблицы «Подлежит ли сигнал обработке» стоит «Да». Два сигнала из таблицы с «Нет» в этой колонке обработке не подлежат. В столбце «Стандартная реакция Node.js» описана стандартная реакция Node.js-программы на получение соответствующего сигнала. В столбце «Цель сигнала» приведено описание стандартного общепринятого подхода к использованию сигналов.
Для обработки этих сигналов в Node.js-приложении можно воспользоваться уже знакомым нам механизмом объекта process по прослушиванию событий:
Возможно, вы уже догадались о том, что Node.js-программы могут отправлять сообщения другим программам. Выполните следующую команду, которая демонстрирует отправку сообщения от короткоживущего процесса работающему процессу:
В ответ на эту команду наш процесс покажет то же SIGHUP-сообщение, что показывал ранее. А если же работу этого процесса нужно завершить, ему надо отправить необрабатываемый сигнал SIGKILL :
После этого работа программы должна завершиться.