Я выполняю отладку узлов через VS Code, что в основном доставляет удовольствие, за исключением случаев, когда отлаживаемый сценарий содержит таймеры (запускаемые через setTimeout(), setImmediate() или setInterval().
Похоже, даже если вы находитесь в режиме отладки, таймеры срабатывают, когда это необходимо, и программа часто дает сбой, когда этого не следует (например, если таймер проверяет, работает ли служба, и данная служба приостановлена в своем выполнение в сеансе отладки).
Я вспоминаю, что в мире C# раньше был способ приостанавливать таймеры в режиме отладки, и Visual Studio автоматически заботилась об этом. Я хочу знать, доступно ли что-то подобное для отладки Node, с VS Code или без него.
Обратите внимание, что рассматриваемый код представляет собой сценарий на стороне сервера, написанный на JavaScript, без использования прокладок или предустановок. Версия Node - 10.0.0. Версия NPM - 6.2.0
Довольно уродливое решение - добавить фрагмент кода, который проверяет, находитесь ли вы в режиме отладки, и отменяет эти функции (например, const originalSetTimeout = setTimeout; setTimeout = function (...args) { if (somehowCheckIfCurrentModuleBelongsToYourCode) { /* do nothing /* } else { setTimeout.apply(this, ...args) } }
@farjad и jfriend00 благодарим вас обоих за ваши комментарии. Таймеры находятся в сторонней библиотеке, которую в идеале я не хочу редактировать. Похоже, другого варианта быть не может. Думаю, всегда можно было клонировать копию, чтобы с ней возиться и вернуться к исходной версии, когда это будет сделано. Думаю, оба ответа верны. Я оставлю это открытым еще на несколько дней, чтобы другие тоже оставили комментарии.
@ cod.ie Я только что заметил небольшую ошибку в своем примере: вам нужно вызвать originalSetTimeout внутри функции (вместо setTimeout). И принимая во внимание ваш последний комментарий, вместо того, чтобы проверять, вызывается ли setTimeout из вашего кода, вам нужно найти способ проверить, действительно ли он вызывается из сторонней библиотеки. Возможно, вам лучше временно изменить библиотеку.





Если таймер находится вне вашей программы и проверяет, жива ли ваша программа, и ваша программа остановлена в точке останова, то вы просто застряли. Когда ваша программа останавливается в точке останова, она останавливается. Он не может отвечать на внешние запросы или запросы. Я постоянно это вижу при отладке серверов socket.io. Клиент socket.io думает, что сервер вышел из строя, когда он находится в точке останова (даже используя отладчик, который поставляется с node.js), поэтому он пытается повторно подключиться. Единственный известный мне способ избежать этого - отлаживать операторы
console.info(), а не точки останова.