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 на 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 несложно: создайте папку и выполните команду 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().
Стандартные встроенные модули:
Фреймворки для Node.js:
Сторонние модули:
Шаблонизаторы.
Модули для работы с Движок БД MySQL.
Модули для работы с Использование и настройка PostgreSQL.
Модули для интернационализации(i18n Интернационализация) и локализации(L10n Локализация программного обеспечения).
Node.js не использует отдельные потоки - все задачи выполняются в одном потоке. Node.js запуская цикл событий, в котором обрабатываются все задачи. Если будет использована блокирующая функция (какой-нибудь аналог функции sleep) - остановится выполнение всех задач, пока не выполнится блокирующая функция. Потому для устранения ожидания выполнения "долгих" функций используются функции обратного вызова. Функция обратного вызова запускается после выполнения "долгой" функции, а в это время цикл событий продолжает обрабатывать остальной код программы.
# 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 - это поток, доступный для записи, который используется для отправки данных обратно клиенту.
# /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");
Node.js обрабатывает Метод HTTP POST запрос в неблокирующем режиме. POST запрос неограничен по размеру. Если передаваемых данных в POST запросе много - это может привести к блокирующей операции. Для избежания блокировки Node.js обслуживает POST- данные небольшими порциями и вызывает callback- функции только при определённых событиях:
Для получения параметров 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");
В случае если ваша форма открытая в 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 зависит от конкретных задач и требований к производительности, безопасности и анонимности. HTTP/HTTPS прокси легко интегрируются с большинством библиотек и фреймворков Node.js, таких как Axios или request. SOCKS5 прокси поддерживают высокую анонимность и безопасность, подходят для более сложных задач, таких как торренты или обход строгих блокировок. Примеры подходящих прокси-сервисов для Node.js вы можете найти в нашем обзоре Гид по выбору прокси-сервера ТОП Лучших Прокси Провайдеров.