Что можно делать в process.on("exit")
Вопрос
В обработчике process.on("exit") хотят отправить последние логи по сети и закрыть пул БД через await pool.end(). Что произойдёт?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Node дождётся всех промисов из обработчика exit
- Асинхронное не выполнится: в
exitevent loop уже стоитправильный ответ - Node отложит выход на 30 секунд для асинхронных операций
- Сработает, только если обработчик объявлен как
async
Разбор
Событие exit срабатывает, когда процесс уже завершается: новые задачи в event loop не обрабатываются, поэтому сетевые запросы и await не завершатся. Асинхронную очистку делают раньше: в обработчике сигнала (SIGTERM) или в beforeExit (он срабатывает, когда цикл опустел сам, но не при process.exit() и не при необработанной ошибке), после чего явно вызывают process.exit().
async на обработчике ничего не меняет: Node не ждёт возвращённый промис. Никакой отсрочки на 30 секунд нет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Код-ревью: обработка ошибок в сервисе
Следующий вопрос
Почему логирование может тормозить сервис