14. Уроки Node.js. Отладка скриптов. Часть 2.

continue

Продолжим наш урок по отладке. Давайте рассмотрим еще один важнейший сценарий отладки, а именно отладку при возникновении ошибок в JavaScript. Например, при обработке запроса:

есть неизвестный вызов WTF()  или что-то еще, от чего JavaScript падает. Сейчас я запущу этот сервер. Захожу в браузере на страницу отладчика. Теперь, если я перейду по адресу сервера, то никакой отладки не произойдет, потому что JavaScript просто упадет. Для того, чтобы отлаживать JavaScript, в этом случае можно зайти в отладчик и здесь кликнуть то же самое, что мы кликнем в отладке в браузере. То есть, сделать эту кнопку паузы кода активной. Вот теперь перехожу на страницу http://127.0.0.1:1337/, и отладчик останавливается на ошибке WTF.

 

Давайте взглянем на еще один пример отладки – консольные утилиты. В файле pow.js есть вычисление степени при помощи рекурсивной функции:

При вызове она должна вывести 23node pow.js, но выводит 32, а не 8. В чем же дело? Чтобы посмотреть, что происходит, попробуем запустить отладчик node debug pow.js. Теперь, если я попробую запустить Nodeinspector, то он запуститься. Но, на самом деле, ничего отлаживаться не будет. Почему? Так как мы понимаем происходящее, то сможем это легко объяснить. Ведь Node запустилась, открыла доступ по порту 5858, а потом выполнила скрипт и все, Node закончила свою работу, она уже все вывела. Никакой Nodeinspector теперь к ней уже не подключится просто потому, что она не запущена. Порт 5858 закрыт. Что делать? То, что нам на самом деле нужно, это другой флаг debugbrk.

node –debug-brk pow.js
Он запускает скрипт сразу, входя в состояние остановки. При запуске оно включает отладчик и теперь ждет, пока кто-нибудь к нему подключится и даст команду продолжить выполнение. Для верности перезапустим Nodeinspector и войду в инструменты разработки через Chrome. Открываю соответствующий url и вижу, где произошла текущая остановка:

Далее я буду рассказывать более подробно для тех, кто, возможно, впервые сталкивается с такими инструментами разработки.

screen_captute_node14

Мы видим текущий скрипт, справа – информация и кнопки управления процессом. Сейчас я нажму на клавишу со стрелкой вниз (клавиша F11). Она переведет управление на следующую команду. Нажмем. Куда же мы попали? Здесь немного тонкий момент. Дело в том, что когда я попытаюсь подключить объект console, то Node.js делает require:

return NativeModule.require(‘console’);

Этот встроенный объект по умолчанию не подключается, а тут нужно его подключить. Процесс подключения console нас не очень интересует, поэтому я нажму другую кнопку, со стрелкой вверх. Она означает, что процесс выполнения нужно продолжить, но остановится, как только произойдет выход из этой функции. Нажмем.

Теперь console подключена. Следующий вызов – обратится к pow. Нажимаем стрелку вниз. Находимся внутри функции pow:

Теперь повторные нажатия (стрелки вниз) будут переводить управления внутрь вложенных вызовов. Обратите внимание на Call Stack справа – он растет. Это последовательность сложенных вызовов функции, которые привели их к текущему положению дел. В данном случае нас интересует pow.js. Это единственный наш файл, остальные все встроенные модули. Был вначале консоль, потом еще один вызов, и еще один. Различаются они локальными переменными.

Дальнейшие шаги по отладке очевидны, поэтому мы переходим к следующему способу отладки, а именно, под IDE. В качестве IDE будет использоваться WebStorm. Для того, чтобы запустить отладку, нам вполне подойдет готовая конфигурация:

Единственное, нужно, чтобы запускалась именно Node, а не supervisor. Запускаем отладку и смотрим, что у нас получилось в console. При запуске в режиме отладки WebStorm добавляет к Node соответствующий параметр debugbrk и указывает ему значение 62181. Это значение – порт, на котором Node должны ожидать подключение отладчика, по умолчанию 62181 (в моем случаем). Ранее, к этому порту подключался Nodeinspector, но сейчас к нему подключен  WebStorm. Соответственно, он реализует необходимый интерфейс. Сейчас, если я зайду в браузер на этот url,

http://127.0.0.1:1337/echo?message=TEST

то происходит остановка. Здесь в WebStorm я уже могу куда-то ходить, анализировать переменные, смотреть urlParsed и т.д.

Итак, резюме по способам отладки в Node.js.

  1. Первый способ – это запуск node debug скрипт. При этом, Node тут же приостанавливает выполнение скрипта и переходит в специальный режим консольной отладки, в котором можно получить список команд через help, управлять выполнение скрипта, переходить в режим console через repl. Это работает, но слишком просто.
  2. Хочется иметь более удобный интерфейс, поэтому в тех случаях, когда это возможно, используется отладка в браузере Chrome через Nodeinspector либо под IDE. Для того, чтобы такая откладка стала возможной, нужно запустить Node со специальным флагом —debug либо debugbrk. при этом debugbrk тут же переведет скрипт в состояние остановки. Если Node запущена с этими флагами, то она дает доступ к встроенному механизму отладки v8. Соответственно, v8 начинает слушать этот порт, по умолчанию 5858, отладчик к нему подключается и может слать команды, которые управляют выполнением, получают текущие переменные и т.д. Для отладки под браузером Chrome в качестве отладчика можно использовать Nodeinspector, который, с одной стороны, подключается к порту Node и умеет говорить с ней, с другой стороны, он показывает страничку в Chrome и принимает через нее команды. Вместо Chrome могут быть и другие достаточно современные браузеры.
  3. Относительно IDE, можно сказать что все зависит от самой IDE и тем как в ней все устроено, это может быть удобно или неудобно. Лично для меня, наиболее надежным способом, как правило, является отладка через Chrome. Но для нее нужно запускать Nodeinspector.

Код урока можно скачать в нашем репозитории.

debugging

Материалы взяты из следующего скринкаста

We are looking forward to meeting you on our website soshace.com

About the author

Stay Informed

It's important to keep up
with industry - subscribe!

Stay Informed

Looks good!
Please enter the correct name.
Please enter the correct email.
Looks good!

Related articles

Уроки Express.js . Логгер, Конфигурация, Шаблонизация с EJS. Часть 2.

Favicon – это все connect Middleware, он смотрит, если url имеет вид favicon.ico, то он читает favicon и ...

3. Уроки Express.js. Шаблонизация с EJS: Layout, Block, Partials

В реальной жизни у нас обычно больше, чем один шаблон. Более того, если уж так ...

24.11.2016

Уроки Express.js. Основы и Middleware. Часть 2.

Всем привет! Давайте продолжим наш урок об основах Express и Middleware. Итог (добавим в ...

No comments yet

Sign in

Forgot password?

Or use a social network account

 

By Signing In \ Signing Up, you agree to our privacy policy

Password recovery

You can also try to

Or use a social network account

 

By Signing In \ Signing Up, you agree to our privacy policy