Веб-сервер на основе nodejs

Для организации серверной части наших проектов нужен веб-сервер. Выберем в качестве него наиболее легкий и при том технологичный nodejs. Серверные скрипты для него можно писать на JavaScript, то есть на том же языке, что используется в браузерах для интерактивных веб-страниц. Это удобно с точки зрения унифицированного написания клиентской и серверной частей системы, а клиентская часть у любого веб-сервиса, как правило, рано или поздно требуется, например, для администрирования, регистрации и показа красивой статистики использования сервиса.

Тот, кто знает MQL5, почти знает и JavaScript. Основные отличия рассмотрены во врезке.

MQL5 vs JavaScript
 
JavaScript является интерпретируемым языком, в отличие от компилируемого MQL5. Для нас, как разработчиков это облегчает жизнь, потому что не нужна отдельная фаза компиляции, чтобы получить работающую программу. По поводу эффективности JavaScript не стоит беспокоиться: все среды исполнения JavaScript применяют прием компиляции JavaScript по требованию JIT(just-in-time) — при первом обращении к модулю. Этот процесс происходит автоматически, неявным образом, однократно за сеанс работы, после чего скрипт выполняется в откомпилированном виде.
 
MQL5 относится к языкам со статической типизацией, то есть при описании переменных мы должны явно задать их тип, и компилятор следит за совместимостью типов. В отличие от этого, JavaScript — язык с динамической типизацией: тип переменной определяется тем, какое значение мы в неё положили, и может изменяться в процессе жизни переменной. С одной стороны это дает гибкость, но и требует осторожности, чтобы избежать непредвиденных ошибок.
 
JavaScript является, в некотором смысле, более объектным языком, чем MQL5, потому что в нем объектами являются почти все сущности. Например, функция — тоже объект, и класс, как описатель свойств объектов, сам тоже — объект (прототипа).
 
JavaScript самостоятельно "занимается" "уборкой мусора", то есть освобождает память, выделенную прикладной программой под объекты. В MQL5 мы должны следить за своевременным вызовом delete для динамических объектов.
 
В синтаксис JavaScript заложено много удобных "сокращений" для записи конструкций, которые в MQL5 приходится реализовывать более длинным способом. Например, чтобы в MQL5 передать в некую функцию параметр, указывающий на другую функцию, нам потребуется описать тип такого указателя с помощью typedef, отдельно определить функцию, подходящую под этот прототип, и только затем передать её идентификатор в качестве параметра. В JavaScript можно определить указываемую функцию (целиком!) непосредственно в списке аргументов вместо параметра-указателя.

Если вы веб-разработчик или уже знакомы с nodejs, можете пропустить этапы установки и настройки.

Скачать nodejs следует с официального сайта nodejs.org. Установка доступна в разных вариантах, например, с помощью инсталлятора или распаковкой архива. В результате установки вы получите в указанном каталоге исполняемый файл node.exe и несколько вспомогательных файлов и папок.

Если nodejs не был прописан в системном пути инсталлятором, это можно сделать для текущего пользователя Windows, выполнив следующую команду в той папке, куда установлен nodejs (где находится файл node.exe):

setx PATH "%CD%"

Альтернативно вы можете редактировать переменные среды Windows из диалога свойств системы (Компьютер -> Свойства -> Дополнительные параметры -> Переменные среды — конкретный вид диалогов зависит от версии операционной системы). В любом случае, мы таким образом обеспечим возможность запуска nodejs из любой папки на компьютере, что нам пригодится в дальнейшем.

Проверить работоспособность nodejs можно, выполнив команды (в командной строке Windows):

node -v
npm version

Первая выводит версию nodejs, а вторая — версию важного встроенного сервиса nodejs — менеджера пакетов npm.

Пакет — это готовый к использованию модуль, дополняющий nodejs конкретным функционалом. Сам по себе nodejs — очень небольшой, и без пакетов требовал бы много рутинного кодирования.

Наиболее востребованные пакеты хранятся в централизованном репозитарии в Интернете и могут быть скачаны и установлены в конкретную копию nodejs или глобально (для всех копий nodejs, если их несколько на машине). Установка пакета в конкретную копию выполняется такой командой:

npm install <package name>

Запускайте её в папке, куда производилась установка nodejs — эта команда разместит пакет локально и не затронет неожиданными правками другие копии nodejs, которые уже есть или, может быть, появятся на компьютере впоследствии.

Нам, в частности, потребуется пакет ws, реализующий протокол WebSocket-ов. То есть необходимо выполнить команду:

npm install ws

и дождаться завершения процесса. В результате мы должны обнаружить в папке <путь_установки_nodejs>/node_modules/ новую вложенную папку ws с необходимым содержимым (вы можете заглянуть в файл README.md с описанием пакета, чтобы убедиться, что это библиотека WebSocket-протокола).

В принципе, пакет содержит реализации как сервера, так и клиента, но вместо последнего мы напишем свой на MQL5.

Весь функционал сервера nodejs сконцентрирован именно в папке /node_modules. Её можно сравнить по назначению со стандартной папкой MQL5/Include в MetaTrader 5. При написании прикладных программ на JavaScript мы будем особым образом подключать, "импортировать" необходимые модули, по аналогии с включением заголовочных mqh-файлов с помощью директивы #include в MQL5.