Здесь речь идет о обработке RPC запросов в NodeJS с примерами.
Отладка nodejs которое работает через IIS
Устанавливаем
npm install -g node-inspect
В web.config system.webServer добавляем
<iisnode loggingEnabled="true" nodeProcessCommandLine=""%programfiles%\nodejs\node.exe" --inspect-brk" />
Открываем сайт в браузере Chrome (страница должна долго грузиться), затем в браузере вводим
chrome://inspect
И должно быть одно приложение, которое слушает порт 9229, нажимаем на него и снимаем breakpoint
Реализация потоков данных
Платформа Node подходит для программирования потоков данных и организации
их передачи. Потоки данных можно представлять как массивы, но вместо
распределения данных в области (в массиве) выполняется распределение данных во
времени. Благодаря передаче данных фрагмент за фрагментом разработчик
получает возможность обрабатывать данные по мере их накопления, а не ждать,
пока будут переданы все данные, а потом выполнять какие-либо действия.
Обратите внимание на организацию передачи потоков данных для файла ресурсов
resource.json:
var stream = fs.createReadStream(‘./resource.json’)
// Событие Data вызывается после появления нового фрагмента данных
stream.on(‘data’, function (chunk) {
console.log(chunk)
})
stream.on(‘end’, function () {
console.log(‘finished’)
})
Событие data вызывается после появления нового фрагмента данных, а событие
end — после загрузки всех фрагментов кода. Фрагменты данных могут иметь
разные размеры (в зависимости от типа данных). Благодаря чтению потока данных
на низком уровне обеспечивается более эффективная обработка данных, чем
ожидание передачи всех данных в буфер памяти.
В Node также поддерживаются записываемые потоки данных, позволяющие
записывать фрагменты данных. Один из подобных потоков — объект ответа (res),
генерируемый в ответ на запрос к HTTP-серверу.
Считываемые и записываемые потоки могут соединяться, образуя каналы, как в
случае использования оператора | в языке написания сценариев оболочки. При этом
обеспечивается эффективный способ записи только что считанных данных без
ожидания считывания и сохранения всего ресурса.
Рассмотрим пример H TTP-сервера, взятый из предыдущего раздела. В данном
случае он будет передавать клиенту поток данных изображения:
var http = require(‘http’);
var fs = require(‘fs’);
http.createServer(function (req, res) {
res.writeHead(200, {‘Content-Type’: ‘image/png’});
// Передача по каналам из считываемого потока в записываемый
fs.createReadStream(‘./image.png’).pipe(res);
}).listen(3000);
console.log(‘Server running at http://localhost:3000/’);
При выполнении этого примера кода данные считываются из файла
(fs.createReadStream) и отсылаются (.pipe) клиенту (res) по мере считывания. Цикл
событий может обрабатывать другие события, пока данные передаются в потоке.
Node поддерживает описанный подход (когда механизм DIRTy предлагается по
умолчанию) на различных платформах, включая разные версии UN IX и Windows.
Базовая библиотека асинхронного ввода-вывода (libuv) была создана для того,
чтобы поддерживать универсальную методику обработки независимо от
родительской операционной системы. В результате обеспечивается упрощенный
перенос программ на другие устройства, на которых они могут выполняться.
Запускаем nodejs через nginx
-
Думаю, кому-нибудь будет полезно знать, как запустить проект на Node.js.
Первым делом необходимо установить саму ноду, но об этом я писать не буду, это размусоленно на триллионах сайтов. А вот как поднять проект на русскоязычных сайтах, инфы маловато. Сам я искал инфу на ру сайтах, но в итоге все равно пришлось питаться инфой из-за бугра.
Задача состоит в следующем:
Запустить ноду.
Писать лог по ошибкам.
Если сайт падает, надо его поднять.
Ставим upstart
sudo apt-get install upstart
Предположим, у вас есть проект site.ru, и расположен он в каталоге
/var/www/nodejs/site/
Создаем файл /etc/init/site.conf
#site.conf description "node.js bin/www" author "username" start on startup stop on shutdown script export HOME="/root" echo $$ > /var/run/site.pid exec sudo -u username /usr/local/bin/node /var/www/nodejs/site/bin/www >> /var/log/site.sys.log 2>&1 end script pre-start script # Date format same as (new Date()).toISOString() for consistency echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/site.sys.log end script pre-stop script rm /var/run/site.pid echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/site.sys.log end script Далее открываем /ect/monit/monitrc check process site with pidfile "/var/run/site.pid" start program = "/sbin/start site" stop program = "/sbin/stop site" if failed port 3000 protocol HTTP request / with timeout 10 seconds then restart
Где порт 3000, впишите свой, по умолчанию нода запускается с портом 3000.
Чтобы избавиться от порта в site.ru:3000, правим конфиг nginx /etc/nginx/nginx.conf
server { server_name site.ru www.site.ru; listen 37.143.15.183; charset UTF-8; set $root_path /var/www/nodejs/site; location / { proxy_read_timeout 120s; proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; } location ~* ^/(webstat|awstats|webmail|myadmin|pgadmin)/ { proxy_pass http://37.143.15.183:81; proxy_redirect http://37.143.15.183:81/ /; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; } location @fallback { proxy_pass http://37.143.15.183:81; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; } include /usr/local/ispmgr/etc/nginx.inc; }
Перезапускаем nginx
service nginx restart
Запускаем проект
start site monit -d 60 -c /etc/monit/monitrc
Открываем site.ru, и если все в порядке, увидите приветствие от Express.
ПС. более подробно можно почитать на забугорном сайте
http://howtonode.org/deploying-node-upstart-monit
HTTP-сервер Hello World
Обычно Node применяется для программирования серверов. В Node очень просто
создавать различные типов серверов. Если вы ранее занимались
программированием серверов, то знаете, что сервер является хостом для
приложения (например, для PH P-приложения хостом является H TTP-сервер
Apache). В Node между сервером и приложением нет никакой разницы.
Вот пример HTTP-сервера, который в ответ на любой запрос выводит сообщение
«Hello World»:
var http = require(‘http’);
http.createServer(function (req, res) {
res.writeHead(200, {‘Content-Type’: ‘text/plain’});
res.end(‘Hello World\n’);
}).listen(3000);
console.log(‘Server running at http://localhost:3000/’);
В ответ на запрос вызывается функция обратного вызова function (req, res) и на
экране появляется ответ «Hello World». Эта модель событий напоминает
прослушивание события onclick в браузере. Поскольку щелчок мышью может
произойти в любой момент, следует воспользоваться функцией, реализующей
нужную для этого случая логику. В Node имеется такая функция, которая
откликается на поступивший в любой момент запрос.