В разработке мобильных и веб-приложений на решение одной и той же задачи можно потратить часы, а можно недели. Факторы, которые влияют на скорость: разные языки программирования, архитектура ПО, квалификация разработчиков, в т.ч. и использование готовых библиотек и фреймворков.
И если для пользователя этот “черный ящик” не очень важен, то для владельца бизнеса, который заказывает приложение — это вопрос денег на разработку, т.к. оценка стоимости проекта складывается из трудозатрат и оценивается компанией-разработчиком в часах.
Как результат — лучшие цены и качество предлагают компании, которые активно включают в работу передовые технологии, расширяют возможности IT систем через интеграцию готовых библиотек, закладывают тестирование ПО как часть архитектуры проекта и оптимизируют рабочее время за счет продвинутых технологий и классных программистов, которым по зубам любая задача. Использование среды Node.js — один из подходов к оптимизации процесса разработки web-приложений.
Почему мы любим Node.js
В Магоре мы постоянно тестируем новые идеи, и уже не первый год работаем с Node.js, который является платформой для запуска как серверных, так и десктопных приложений на языке ява-скрипт, (кстати, на Node.JS можно и микроконтроллеры программировать). Т.о. Node.js применяется преимущественно на сервере, выполняя роль веб-сервера». И задачи, которые потребовали бы привлечения дополнительных программистов-бекэндеров, решаются с меньшими трудозатратами.
Использование NodeJS для решения типовых задач
- трекинг пользователей по GPS-координатам в реальном времени;
- разработка чата с огромным количеством одновременно общающихся пользователей,
- прототипирование проектов различной сложности,
- поиск оптимальных результатов в определенном радиусе по заданным критериям;
- создание/редактирование абстрактных объектов для формирования реляционных и нереляционных баз данных,
- взаимодействие с ПО для связи с периферийными устройствами,
- сбор и обработка статистических данных, и пр.
Преимущества Node JS:
- Низкий порог входа — могут начать работать даже люди с минимальными знаниями в программировании. Почти каждый разработчик сталкивался в какой-то степени с Javascript, и ему не составит особого труда изучить Node JS;
- Достаточно высокая производительность и стабильность, благодаря использованию V8 движка (V8 engine) от Гугл и методологии event loop;
- Возможность оперировать данными в формате JSON (object notation) и при необходимости хранить их в этом же формате в базе данных; Огромное количество модулей, расширяющих функционал и поддерживаемых огромным обществом;
- Отлично подходит для создания приложений, работающих в режиме реального времени и стриминга;
- Поддерживается огромным количеством спонсоров, таких как Linux Foundation, PayPal, Joylent, Microsoft и пр.
- Огромный выбор площадок для хостинга.
Пример из нашей практики:
Классическая проблема пользователей мобильных устройств: поиск ближайших статичных и движущихся объектов на карте, людей — достаточно распространенная задача, с которой сталкиваются все разработчики мобильных приложений.
Рассмотрим конкретный кейс Магоры:
поиск парковочного места для краткосрочной аренды.
Для предоставления релевантных результатов пользователю необходимо учесть следующие факторы:
- Актуальные GPS-координаты и радиус поиска — можно выбирать, насколько далеко искать парковочные места, какую единицу измерения использовать (метры, километры);
- Открыт ли доступ к конкретному парковочному месту — было требование, что арендодатель может в любой момент приостановить предоставление места в аренду;
- Доступность места по интервалу времени (временному окну) — пользователь мог выбирать, с какого и до какого часа ему необходимо место;
- Тип транспортного средства — например, парковка для трейлера, автобуса или легкового автомобиля;
- Минимальная и максимальная стоимость аренды.
Из всех вышеперечисленных факторов наиболее сложным был поиск доступного временного окна, так как владелец парковочного места мог настраивать расписание, по которому он сдает его в аренду. Например, если днем он находится на работе или уезжает за город только на выходные.
Специфика задачи: система должна была определить, свободно ли место в запрошенный пользователем интервал времени и показать ему релевантные варианты. В нашем случае нужно было учитывать временную зону, в которой находятся арендатор и арендодатель, переходы между днями (например с 8 вечера до 7 утра), конкурентов в борьбе за парковочное место (занято 2 часа из доступного 8 часового окна).
После отображения списка доступных мест, пользователь выбирал оптимальный вариант и формировал бронь на необходимый период времени. Предварительная бронь была действительна в течение нескольких минут, за которые пользователь вносил плату за место. После этого бронь становилась постоянной и была активна до конца периода аренды.
Результат: Эта задача была успешно решена в рамках одного из наших проектов с использованием NodeJS, он позволил легко оперировать поиском в базе данных, оперативно возвращая результат обработки запроса пользователю, не усложняя техническую сторону вопроса.

Технические детали проекта: В качестве основного фреймворка, который использовался для построения архитектуры серверного приложения использовался Loopback 3.0. В качестве СУБД использовалась MongoDB.
Для демонстрации фрагмента этого изящного решения , можно привести часть запроса, который выполнялся к базе для поиска:
На данном фрагменте кода видно, как можно применять фильтры для получения конкретных результатов: можно задавать максимальное удаление от точки поиска, единицы измерения, другие параметры. Также в приведенном примере используются связи (relations), которые позволяют задавать более детальные фильтры.
Лайфхаки работы с NodeJS
В процессе работы с NodeJS мы встречаем различные ситуации, которые заставляют нас не просто подумать над способами разрешения, а оперативно протестировать несколько альтернатив. Эти ситуации, будь-то архитектурный подход или разработка какой-либо фичи (feature), требуют непосредственно кодинга и отладки. В итоге, у одного разработчика фича может занять 4 часа, а у другого ни на второй, ни на третий день не выходит “каменный цветок”.
Одной из причин, почему так происходит, я вижу случаи, когда разработчики просто не умеют пользоваться отладчиком для NodeJS. Хотя, на самом деле, это просто. (переходите к следующему разделу, если пока не собираетесь становиться разработчиком на NodeJS)
Отладка серверного кода с помощью Node JS
Существует 2 способа отладки написанного серверного кода, хотя под капотом, на самом деле, кроется один:
- Отладка с помощью инструмента Node Inspector, который во многом похож на консоль разработчика браузера Chrome, что само по себе не удивительный факт, так как сам Node JS построен на Google V8 engine.
- Отладка с помощью любимой IDE — удобно: пишешь код и тут же отлаживаешь.
Для первого случая обратимся к официальной документации от NodeJS: необходимо запустить процесс с помощью флага —inspect или —inspect-brk node —inspect[=Port] path/to/file.js node —inspect-brk[=Port] path/to/file.js
Разница между этими 2мя флагами в том, что —inspect запустит отладчик и выполнит весь код до момента ожидания. В таком случае точки останова (breakpoints) можно ставить только в обработчиках событий. В случае же с флагом —inspect-brk отладчик запустит отлаживаемый процесс и остановится на первой операции для выполнения, ожидая действий от разработчика. Также можно указать порт, который будет использоваться при отладке (по умолчанию 9229).

После запуска процесса в окне консоли выведется информация вида
Debugger listening on ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e
Нас интересует адрес и порт, который мы будем использовать. Переходим по адресу http://[host:port]/json/list, где host и port следует указывать из шага выше после перехода по указанному адресу мы увидим JSON следующего вида:
{ «description»: «node.js instance», «devtoolsFrontendUrl»: «chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e», «faviconUrl»: «https://nodejs.org/static/favicon.ico», «id»: «0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e», «title»: «node», «type»: «node», «url»: «file://», «webSocketDebuggerUrl»: «ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e» }
Находим поле devtoolsFrontendUrl, копируем значение и вставляем в строку браузера Chrome и ему подобных. Отобразится окно, в котором мы можем отлаживать процесс так же, как и обычную web-страницу
- Необходимо запустить процесс с помощью флага —inspect или —inspect-brk
node —inspect[=Port] path/to/file.js node —inspect-brk[=Port] path/to/file.js
Находим поле devtoolsFrontendUrl, копируем значение и вставляем в строку браузера Chrome и ему подобных.
Отобразится окно, в котором мы можем отлаживать процесс так же, как и обычную web-страницу
Для работы IDE необходимо указать параметры, которые будут использоваться при отладке, такие как
- исполняемый файл NodeJS, который необходимо проверять;
- переменные среды, которые необходимо установить (необязательно);
- параметры запуска процесса (необязательно);
- среда исполнения и версия NodeJS (необязательно);

Большинство IDE и предоставляют инструкции, как настроить отладку.
Пример настройки отладчика для IntelliJ IDEA
(аналогично настраиваются остальные продукты этой компании)
- Для настройки нам нужно установить плагин.
- В правом верхнем углу кликаем на кнопку Add Configuration
- В появившемся окне нажимаем на иконку +
- Выбираем Node.js
- В открывшемся окне заполняем поля
- Если есть какие-то ошибки, они будут указываться чуть выше кнопок OK, Cancel и Apply< p>. Например, на скриншоте выше от нас требуют указать правильную папку с проектом. Если все верно и ошибок нет, нажимаем кнопкуOK.Конфигурация создана, можно пробовать запускать. В правом верхнем углу теперь отображается название только что созданной конфигурации, зеленые иконки треугольника и жука.
Первая просто запускает процесс NodeJS, а вторая, с жуком, запускает отладчик. Кликаем на нее.
- IDE начнет отладку проекта. Если была поставлена точка останова, IDE остановится на выбранной строке.
На скриншоте представлена IDE в режиме отладки с остановленным на точке останова скриптом. Внизу мы видим панель отладчика. На ней представлены кнопки пошагового выполнения скрипта, callstack процесса и окно для просмотра текущих значений переменных.
- Также на вкладке Debugger Console отладчика можно вводить выражения для вычисления на лету, с автодополнением.
Это была краткая инструкция об инструменте отладки, который экономит очень много сил и времени при разработке и проверке кода.