29Sep

continue

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

server.on('request', function(req, res) {
    var urlParsed = url.parse(req.url, true);

    WTF();

    if (req.method == 'GET' && urlParsed.pathname == '/echo' && urlParsed.query.message) {
        res.end(urlParsed.query.message );
        return;
    }

    res.statusCode = 404;
    res.end('Not Found');

});

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

 

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

function pow(x, n) {
    if (n < 0) {
        return x
    }
    var result = x* pow(x, n-1);
    return result;
}

console.log( pow(2, 3) );

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

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

function pow(x, n) {
    if (n < 0) {
        return x
    }
    var result = x* pow(x, n-1);
    return result;
}

console.log( pow(2, 3) );

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

screen_captute_node14

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

return NativeModule.require(‘console’);

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

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

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

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

var http = require('http');
var url = require('url');

var server = http.createServer();

server.on('request', function(req, res) {
    var urlParsed = url.parse(req.url, true);
    debugger
    
    if (req.method == 'GET' && urlParsed.pathname == '/echo' && urlParsed.query.message) {
        res.end(urlParsed.query.message );
        return;
    }

    res.statusCode = 404;
    res.end('Not Found');
});

server.listen(1337);
console.log("Server is running"); 

Единственное, нужно, чтобы запускалась именно 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

7. Уроки Node.js. Модуль Console

А теперь поговорим о следующем встроенном модуле console. Как мы уже знаем , он использует util.format и util.inspect для вывода. Console в отличие от util является глобальной переменной. Это большая редкость в Node.js, но, действительно, сonsole не обязательно мы должны require. Она есть везде.

9. Уроки Node.js. События, EventEmitter и Утечки Памяти

Следующий объект, который нас интересует, это EventEmitter или, как его иногда называют, ЕЕ. EventEmitter представляет собой основной объект, реализующий работу с событиями в Node.js. Большое количество других встроенных объектов, которые генерируют события, ему наследуют. Для того чтобы воспользоваться EventEmitter достаточно подключить модуль “events”встроенный и взять с него соответствующее свойство (создадим ee.js) :

var EventEmitter = require(‘events’).EventEmitter;

11. Уроки Node.js. Эхо-сервер.

Всем привет! На этом занятии мы создадим эхо-сервер, то есть, такой сервер, который при запросе на url /echo c параметром message выдает значение этого параметра:

// http://127.0.0.1:3000/echo?message=Hello -> Hello
На все другие запросы отвечает: Страница не найдена.

Начнем вот с такого шаблона:

Leave a Reply