Начало работы с node.js

node.js — полностью самостоятельная платформа, включающая, кроме движка, встроенный сервер (HTTP и TCP/UDP/Unix-soket) и базовый набор библиотек, а также предоставляющей полностью асинхронную работу с файлами и сетевыми устройствами. Фреймворк node.js основан на JavaScript движке Google V8. Движок V8 написан на C++.

Основное преимущество node.js неблокирующий ввод/вывод, то есть все запросы обрабатываются параллельно, не пересекаясь.

node.js 0.6 (нечётные ветки - экспериментальные, а чётные (0.2, 0.4, 0.6) - стабильные).

IDE с поддержкой node.js:

Программы Node делятся на три основных типа: веб-приложения, средства ко­мандной строки и демоны и настольные приложения.

К категории веб-приложений относятся простые приложения, предоставляющие одностраничные приложения, микрослужбы REST и веб-приложения полного стека. Возможно, вы уже исполь­зовали средства командной строки, написанные с использованием Node, например npm, Gulp и webpack. Демоны (daemons) представляют собой фоновые службы. Хо­рошим примером служит менеджер процессов PM2. Настольные приложения обычно строятся с применением фреймворка Electron (http://electron.atom.io/), использующего Node во внутренней реализации для на­ стольных веб-приложений.

Существуют некоторые типы приложений, в которых Node особенно заметно превосходит конкурентов. Node обычно используется для создания веб-приложений реального времени; к этой категории может отно­ситься что угодно, от пользовательских приложений (скажем, чат-серверов) до внутренних систем сбора аналитики.

Установка node.js

Простейший способ установить Node на Mac или Windows — использовать программу установки с сайта https://nodejs.org. Установка node.js при помощи nvm.

node.js не имеет внешних зависимостей, кроме Python, который используется при сборке.

Рабочее окружение:

# uname -a
Linux 3.0.0-12-generic #20-Ubuntu SMP Fri Oct 7 14:56:25 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
# apt show nodejs
Version: 0.4.9-1ubuntu3
Depends: libc-ares2 (>= 1.7.3), libc6 (>= 2.6), libev4 (>= 1:4.04), libgcc1 (>= 1:4.1.1), libssl1.0.0 (>= 1.0.0), libstdc++6 (>= 4.1.1), libv8-3.1.8.22

Установка node.js 4.9 из репозитория Ubuntu:

# apt install nodejs libc-ares2 libev4 libv8-3.1.8.22

Установка node.js 0.6.0 последней стабильной версии:

# apt install libc-ares2 libev4 libv8-3.1.8.22 libssl-dev g++ apache2-utils
# mkdir /opt/nodejs
# cd /opt/nodejs
# wget -c http://nodejs.org/dist/v0.6.0/node-v0.6.0.tar.gz
# tar -xvf node-v0.6.0.tar.gz
# cd node-v0.6.0/
# ./configure
Checking for program g++ or c++          : /usr/bin/g++ 
Checking for program cpp                 : /usr/bin/cpp 
Checking for program ar                  : /usr/bin/ar 
Checking for program ranlib              : /usr/bin/ranlib 
Checking for g++                         : ok  
Checking for program gcc or cc           : /usr/bin/gcc 
Checking for gcc                         : ok  
Checking for library dl                  : yes 
Checking for openssl                     : yes 
Checking for library util                : yes 
Checking for library rt                  : yes 
Checking for fdatasync(2) with c++       : yes 
'configure' finished successfully (0.514s)
# make
# make install

Проверяем:

$ which node
/usr/local/bin/node
$ /usr/local/bin/node -v
v0.6.0

Для обновления node.js до следующей версии процедура аналогичная - ничего удалять не надо, инсталлятор все заменит сам.

Создание нового проекта Node

Создать новый проект Node несложно: создайте папку и выполните команду npm init. И все! Команда npm задаст несколько вопросов, вы можете ответить на все вопросы утвердительно. Полный пример:

mkdir my_module
cd my_module
npm init -y

Флаг -y означает подтверждение (yes). Таким образом, npm создаст файл package. json со значениями по умолчанию. Если вы хотите полностью управлять процессом создания проекта, опустите флаг -y; npm задаст ряд вопросов о лицензии проекта, имени автора и т. д. После того как все будет сделано, просмотрите содержимое файла package.json. Вы можете отредактировать его вручную, но помните: файл должен содержать корректную разметку JSON. Пустой проект успешно создан, теперь можно переходить к созданию модуля.

Ключ debug включает в Node.js клиента отладчика V8, который становится доступен на порту 5858 протокола TCP. Отладчик Node не поддерживает полный набор команд но выполнение и просмотр окружения вполне возможны.

Например можно запустить из скрипта:

#!/bin/sh
NODE='/opt/nodejs/node-v0.6.0/out/Release/node'
SRV='/var/www/nodejs/node_http_srv.js'

#$NODE $SRV >> /var/log/nodesrv.log 2>&1 &
# Debug
$NODE --debug $SRV >> /var/log/nodesrv.log 2>&1 &

Подключаемся к отладчику при помощи Примеры использования telnet

$ telnet localhost 5858

Вместе с Node.js поставляется несколько стандартных встроенных модулей, они находятся в папке lib/ исходного кода node. Модули кешируются при первой загрузке. Для того, чтобы определить, какой модуль был загружен при вызове require(), можно воспользоваться функцией require.resolve().

Модуль "sys" с версии 0.6 называется "util".

Стандартные встроенные модули:

  • Модуль querystring предоставляет инструменты для работы со строкой запроса.
  • Объект console v0.6.x Enconsole v0.4.x RU для вывода в стандартный поток вывода stdout и стандартный поток ошибок stderr
  • Модуль VM v0.6.x En VM v0.4.x RU служит для выполнения JavaScript в изолированной среде.
  • Поддержка json встроена в node.js. Manipulating JSON and XML with Node.js.
  • Модуль child-process позволяет работать с дочерними процессами: порождать их, передавать и получать информацию в асинхронном режиме, управлять работой потока.

Фреймворки для Node.js:

  • Фреймворк Express отличается высокой производительностью. Много разных плюшек. Большая часть функционала Express содержится в плагинах.

Сторонние модули:

Шаблонизаторы.

Модули для работы с Движок БД MySQL.

Модули для работы с Использование и настройка PostgreSQL.

Модули для интернационализации(i18n Интернационализация) и локализации(L10n Локализация программного обеспечения).

Использование node.js

Node.js не использует отдельные потоки - все задачи выполняются в одном потоке. Node.js запуская цикл событий, в котором обрабатываются все задачи. Если будет использована блокирующая функция (какой-нибудь аналог функции sleep) - остановится выполнение всех задач, пока не выполнится блокирующая функция. Потому для устранения ожидания выполнения "долгих" функций используются функции обратного вызова. Функция обратного вызова запускается после выполнения "долгой" функции, а в это время цикл событий продолжает обрабатывать остальной код программы.

В настоящее время node.js не отличается надежностью и быстротой. По видимому оптимальнее перед node.js ставить, например Nginx, что позволит в случае тайм-аута перебросить запрос на другой сервер.
# nano iptables_log.js
var sys = require('util'), net = require('net'), spawn = require('child_process').spawn, http = require("http");
sys.puts('\nMy process PID: ' + process.pid + '\n');
var tail = spawn('tail', ['-f', '/var/log/ulog/syslogemu.log']); // указываем log файл

sys.puts("Start tail -F syslogemu.log");

tail.stdout.addListener("data", function (data)
{ sys.puts(data);
// дублируем себе на консоль
});

http.createServer(function(request, response)
{
response.writeHead(200, {'Content-Type': 'text/plain'});
tail.stdout.addListener("data", function (data) { response.write(data); });
}).listen(1277, "127.0.0.1");

Функция spawn() создает дочерний процесс утилиты tail, процесс запускается только один раз во время старта сервера. Команда tail будет выводить новые данные из лог файла и транслировать вывод на веб-страницу каждому подключившемуся клиенту. Request - это поток, доступный для чтения, который содержит данные каждого http-запроса (например, подтверждение формы или загрузка файла). Response - это поток, доступный для записи, который используется для отправки данных обратно клиенту.

  • Запуск скрипта iptables_log.js.
# /opt/nodejs/node-v0.6.0/out/Release/node /scripts/iptables_log.js

В браузере набираем http://localhost:1277

Для обработки URL и получения данных get запроса используется модуль 'url'. Для примера разберем HTTP GET запрос вида:

http://localhost:1277/cmdpath?nameparam1=valueparam1
var util = require('util'), net = require('net'),
spawn = require('child_process').spawn, 
http = require("http"), url = require('url');

util.puts("Start Node.js");

http.createServer(function(request, response){
    util.puts("Start HTTP Server");

    util.puts(request.url);
    var urlObj = url.parse(request.url, true);
    util.puts(urlObj.href);
    util.puts(urlObj.search);
    util.puts(urlObj.query.nameparam1); // получаем значение переменной nameparam1
    util.puts(urlObj.pathname);

}).listen(1277, "127.0.0.1");

HTTP POST кросс-доменный запрос

Node.js обрабатывает Метод HTTP POST запрос в неблокирующем режиме. POST запрос неограничен по размеру. Если передаваемых данных в POST запросе много - это может привести к блокирующей операции. Для избежания блокировки Node.js обслуживает POST- данные небольшими порциями и вызывает callback- функции только при определённых событиях:

  • событие data наступает, когда приходит новая порция POST-данных
  • событие end наступает, когда все части данных были получены.

Для получения параметров POST запроса можно использовать модуль querystring.

var util = require('util'), net = require('net'),
spawn = require('child_process').spawn, 
http = require("http"), url = require('url');
var querystring = require("querystring");

http.createServer(function(request, response){
util.puts("Start HTTP Server");
//обработка POST запроса
var postData = null;
request.addListener("data", function(postDataChunk) {
// собираем в переменную postData весь POST запрос
postData += postDataChunk;
console.log(postData);
});
request.addListener("end", function() {
response.writeHead(200, {
'Content-Type': 'text/plain'
}); 
response.write("You've sent: " + querystring.parse(postData)["job"]+"\n");
response.write("You've sent: " + querystring.parse(postData)["indomain"]+"\n");
response.write("postData: " + postData);
console.log(querystring.parse(postData));

});
}).listen(1277, "127.0.0.1");
  • Access-Control-Allow-Origin

В случае если ваша форма открытая в Apache отсылается Node.js, например так

var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://localhost:1277/', false);

то вы будите заблокированы браузером c ошибкой Origin http://YouDomen is not allowed by Access-Control-Allow-Origin. Для устранения вы должны в node.js разрешить XSS (кросс-доменные, межсайтовые запросы). В примере ниже строка 'Access-Control-Allow-Origin' : '*' открывает подобные запросы для всех. Для безопасности нужно указать конкретный домен.

        var body = 'hello world';
        response.writeHead(200, {
            'Content-Length': body.length,
            'Content-Type': 'text/plain',
            'Access-Control-Allow-Origin' : '*'
        });

Т.е. кросс-доменный запрос отсылается точно так же, как и обычный XMLHttpRequest, но браузер посылает на сервер дополнительный заголовок Origin. Сервер в ответе указывает заголовком Access-Control-Allow-Origin, для каких доменов доступны данные.

PQ VPS сервера в 28+ странах.