Инструменты пользователя

Инструменты сайта


Боковая панель

Связь

node.js

node.js

Homepage: node.js

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

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

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

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

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
# aptitude 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:

# aptitude install nodejs libc-ares2 libev4 libv8-3.1.8.22

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

# aptitude 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 до следующей версии процедура аналогичная - ничего удалять не надо, инсталлятор все заменит сам.

Debug Node.js

Ключ 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 отличается высокой производительностью. Много разных плюшек.

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

  • Модуль node-msgpack - API для сериализации и де- сериализации объектов. JSON.
  • Модуль node_pcap - биндинг для библиотеки libpcap, которую использует tcpdump и Wireshark для захвата пакетов.
  • Модуль node-ncurses - биндинг для ncurses
  • Модуль always - демон always отслеживает событие изменения в разрабатываемом файле и автоматически перезапускает ваш проект. Можно применять не только с Node.js.
  • Модуль js-yaml - парсер формата YAML (формат для файлов конфигурации)
  • Модуль Cookies для установки Cookie. Понимает HTTPonly куки.
  • Модуль Keygrip для подписания и проверки данных (например, Cookie или URL).
  • Модуль everyauth - Аутентификация и Авторизация пользователя например при помощи пароля, Twitter, Github и др.

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

Модули для работы с MySQL.

  • Модуль node-mysql - взаимодействие с MySQL сервером.

Модули для работы с PostgreSQL.

Модули для интернационализации(i18n) и локализации(L10n).

nmp установка дополнительных модулей

npm - package manager for nodejs. Установить можно из репозитория ОС или с сайта http://npmjs.org

# curl http://npmjs.org/install.sh | sh
$ which npm
/usr/local/bin/npm

Пример. Установим модуль express, второй вариант установка модуля express конкретной версии.

# cd /opt/nodejs/
# npm install express
# npm install express@1.0.0

В дальнейшем модуль можно загружать по абсолютному пути require('/opt/nodejs/node_modules/express/express.js'

Модули можно устанавливать глобально, для этого используется ключ -g.

# npm install always -g

Пример. Поиск модулей например, Jade:

# npm search jade
...
jade                 Jade template engine                                          =tjholowaychuk
jade-browser         express/connect middleware that serves jade compiled templates to the browser =nw =storify
jade-client-connect  Jade Client Connect - A compiler to help use templates on a web client =sioked
...                                                                           =rauchg

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

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

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

Вывод в реал-тайме логов iptables

  • Вывод в реал-тайме логов iptables.
# 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

HTTP GET запрос

Для обработки 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 обрабатывает 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, для каких доменов доступны данные.

Ссылки




node.js.txt · Последние изменения: 2015/05/19 07:14 (внешнее изменение)