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

19. Уроки Node.js. Безопасный Путь к Файлу в fs и path.

В этой статье мы рассмотрим, как при помощи Node.js создать веб-сервер, который будет возвращать файл пользователю из директории public. Может возникнуть вопрос: зачем здесь Node.js? почему бы не сделать это на другом сервере? Вопрос совершенно уместен. Да, для отдачи файлов, как правило, другие сервера будут более эффективны. С другой стороны, Node.js, во-первых, тоже работает весьма неплохо, а во-вторых, перед отдачей файла может совершить какие-то интеллектуальные действия, например, обратиться к базе данных, проверить, имеет ли пользователь право на доступ к данному файлу, и только если имеет, тогда уже отдавать.

22. Чат через long-polling, чтение POST. Pt.1.

Всем привет! Цель этого занятия – научиться делать чат на Node.js. Для начала наш чат будет достаточно простой. Всего лишь каждый, кто заходит по этому url

http://localhost:3000/

автоматически попадает в комнату, в которой может получать сообщения от другого пользователя, находящегося в этой же самой комнате, в нашем случае переписка может вестись из разных браузеров. Мы будем делать его в начале без пользователей, базы данных, авторизации.

22. Чат Через Long-Polling. Чтение POST. Pt.2.

Соответственно, что бы мы не записали, отправляется одно и то же. Давайте мы это поправим. Сообщения у нас отправляются методом POST. Для того, чтобы считать этот метод из req, нужно поработать с ним, как с потоком. Для этого посмотрим на следующую схему, которая описывает жизненный цикл запроса, а именно объектов req и res.

Leave a Reply