Выбор ответа Senior Ошибки и логирование обновлено

Что можно делать в process.on("exit")

Вопрос

В обработчике process.on("exit") хотят отправить последние логи по сети и закрыть пул БД через await pool.end(). Что произойдёт?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Асинхронное не выполнится: в exit event loop уже стоит. Событие exit срабатывает, когда процесс уже завершается: новые задачи в event loop не обрабатываются, поэтому сетевые запросы и await не завершатся.

Варианты ответа

  1. Node дождётся всех промисов из обработчика exit
  2. Асинхронное не выполнится: в exit event loop уже стоитправильный ответ
  3. Node отложит выход на 30 секунд для асинхронных операций
  4. Сработает, только если обработчик объявлен как async

Разбор

Событие exit срабатывает, когда процесс уже завершается: новые задачи в event loop не обрабатываются, поэтому сетевые запросы и await не завершатся. Асинхронную очистку делают раньше: в обработчике сигнала (SIGTERM) или в beforeExit (он срабатывает, когда цикл опустел сам, но не при process.exit() и не при необработанной ошибке), после чего явно вызывают process.exit().

async на обработчике ничего не меняет: Node не ждёт возвращённый промис. Никакой отсрочки на 30 секунд нет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.