28Sep

558936827d369

Следующая наша тема касается отладки под Node.JS. первым делом мы рассмотрим самый простой встроенный отладчик, который вызывается командой node debug. Выглядит это так. Допустим, у нас есть скрипт:

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);

    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");

Например, server.js, который упорно глючит, и мы хотели бы остановить его на некотором моменте, чтоб посмотреть переменные и что происходит. Поэтому мы в этом месте ставим debugger:

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 debug server.js. Никаких модулей для этого ставит не надо. Изначально скрипт находится в состоянии паузы. Видите, ничего не происходит. В режиме откладки есть некоторые команды, из которых мне сейчас нужна cont. Она заставит скрипт продолжить выполнение. Как видите, он продолжил и даже вывел в что-то конце log. Отлично!

Теперь перейдем к браузеру и зайдем на url 127.0.0.1:1337 с этим портом. Как мы зайдем, происходит событие request, запускается обработчик, и выполнение останавливается как раз на команде debugger. Теперь я могу перейти в консоль repl – режим выполнения команд, и, например, выяснить, что такое urlParsed, или запустить что-то, скажем:

res.end(“Uahahaha!”) 

И смотрим, что стало с браузером. Отлично! Все работает.

Надо сказать, что встроенный отладчик, который мы рассмотрели, это самое простое, что только бывает. Его используют в тех редких случаях, когда более продвинутые способы отладки почему-то не работают, или когда лень их запускать.

Node.JS-Debugging-Tools

Гораздо удобнее осуществлять отладку, используя инструмент разработчиков в браузере Chrome. Для этого нам понадобится утилита, которая называется Nodeinspector:

npm install -g node-inspector

Поставим ее глобально. На этом приготовления завершены. Теперь несколько слов о том, что сейчас будет происходить. У Node.js при запуске есть специальный параметр —debug, после которого можно написать скрипт(–debug server.js). Когда Node.js запускается с этим параметром, то он не только запускает server.js, он также начинает слушать происходящее на этом порту. К этому порту может подключиться другая программа и давать команды Node.js относящиеся к отладке, например, приостановить или возобновить выполнение, получить текущее значение какой-то переменной и т.д. эти команды выдаются в соответствии со специальным протоколом, который описан в документации к v8. Например, команда

{“seq”:117,”type”:”request”,”command”:”continue”}  

означает продолжить выполнение continue. А вот такая:

“seq”:117,”type”:”request”,”command”:”evaluate”,”arguments”:{“expression”:”1+2″}}

говорит Node.js вычислить  1+2. Мы, конечно же, эти команды вручную набирать не будем, хотя могли бы. Мы используем утилиту Nodeinspector, которая будет посылать эти команды, а нам предоставлять красивый веб-интерфейс.

Итак, оставлю Node.js запущенным и открою новое окно консоль, в котором запущу nodeinspector. Это веб-сервер, к которому можно подсоединиться под этим url, который он дает, и работать с отладчиком. То есть, я буду слать команды веб-серверу Nodeinspector, а он будет транслировать их для Node, которая слушает протокол отладки, используя язык отладки v8.

Итак, зайдем в Nodeinspector. Этот дизайн похож на встроенные Chrome  инструменты разработки, но на самом деле, это не они. Они похожи, поскольку стили, html взяты из движка webkit. Соответственно, интерфейс очень похож. На самом деле, это всего лишь веб страница, которую нам отдает Nodeinspector.

Зайдем в отдельном окне  на страницу:

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

Произошло следующее. Когда я перешел по этому адресу, то сработала функция обработчика request. Если бы Node.js был запущен без флагов отладки, то команда debugger была бы проигнорирована, но в нашем случае она сработала. v8 приостановила выполнение JavaScript и послала Nodeinspector, который подключен к Node по этому порту: 5858, об этом информацию. Nodeinspector ее получил и при помощи протокола web-soсkеt, с которым познакомимся далее, переслал ее в браузер, браузерному JavaScript. Здесь на это отреагировал веб-интерфейс и мне показал мне остановку. Этот же интерфейс запросил данные об остановке, которым я могу воспользоваться. При этом, Nodeinspector берет на себя трансляцию моих действий в команды для отладчика v8. Могу даже использовать console.Если хочу ответить на запрос, то могу сделать так же, как делал со встроенным отладчиком, а именно вызвать метод в текущем контексте.

Все очень удобно. Этим рекомендуется пользоваться. Единственное, следует иметь в виду, что мы работаем с цепочкой соединений. Зайдя в данный url к Nodeinspector, присоединяемся из клиентского браузерного JavaScript к серверному Nodeinspector, тот присоединяется к Node.js, и бывает так, что некоторое из этих соединений рвется. Соответственно, отладки перестают работать. В этом случае можно зайти заново на станицу отладки, если это не помогло, перезапустить Nodeinspector. Если и это не помогло, то перезапустить по цепочке все: Node, Nodeinspector, и зайти заново на страницу в браузере. Тогда точно все будет хорошо.

tumblr_ng6oke7J1k1sxr61eo1_1280

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

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

6. Уроки Node.js. Util и Наследование

Всем привет! Тема ближайших статей: Самые часто используемые модули Node.js.

Первым методом, который мы изучим, будет метод util inspect модуля, встроенного util. Этот метод позволят красиво вывести любой объект, даже если у этого объекта, как в этом примере, есть ссылка на самого себя.

21. Уроки Node.js. Writable Поток Ответа res, Метод pipe. Pt.1

Нашим следующим шагом будет использование потоков для работы с сетевыми соединениями. И начнем мы с отдачи посетителю файлов. Если помните, у нас была такая задача: если посетитель запросит следующий url, то отдать ему файл. Создадим файл pipe.js со следующим кодом:

Leave a Reply