Node.js: проверьте, что осталось в цикле событий, что предотвращение естественного выхода из script

Node.js script не будет выходить, если в цикле основного события останутся обратные вызовы. Хотя можно принудительно завершить script, вызвав process.exit() или выбросив исключения, рекомендуется разрешить script "естественно", всегда делая правильную очистку. Однако иногда это может быть затруднено, поскольку ошибки в коде могут препятствовать правильной очистке, например, я могу забыть удалить объект IntervalObject, когда он больше не нужен, и т.д., Что в конечном итоге предотвратит завершение работы программы.

Следовательно, есть ли способ отладить не-завершающий script, чтобы узнать, что осталось зарегистрированным в цикле событий? Другими словами, есть ли способ в Node.js отлаживать то, что предотвращает выход программы?

Ответ 1

Вы можете вызвать process._getActiveRequests(), чтобы получить список активных запросов ввода-вывода и process._getActiveHandles(), чтобы получить список дескрипторов открытых дескрипторов/файлов.

Ответ 2

Node.js, начиная с версии 8, предоставляет удобный модуль для получения такого рода информации.

async_hooks: API для регистрации обратных вызовов, отслеживающих время жизни асинхронных ресурсов, созданных в приложении Node.js.

Ответ 3

Пакет wtfnode использует инструменты, упомянутые @mscdex, но представлен более удобным для разработчиков способом. Я настоятельно рекомендую это для отслеживания этих неприятностей.

const wtf = require('wtfnode');

// ...

wtf.dump();