imported>Vix |
imported>Vix |
Строка 1: |
Строка 1: |
| process.nextTick(callback) - Гарантированно вызовет функцию callback в следующем цикле eventloop
| | [[Файл:Zabbix2.png]] |
| | | <hr> |
| ==Серверный JavaScript==
| | == Установка и настройка == |
| [[Руководство NodeJS]] | | '''''- Система Debian Jessie (8)''''' |
| [[Node.js Virtual Machine (vm) Usage (перевод)]]
| |
| ===Node.JS Parent Process ID===
| |
| Is it possible to get the parent process-id using Node.JS? I would like to detect if the parent is killed or fails in such a way that it cannot notify the child. If this happens, the parent process id of the child should become 1.
| |
| | |
| This would be preferable to requiring the parent to periodically send a keep-alive signal and also preferable to running the ps command.
| |
| @Emmerman: I'm not sure what you mean. The parent runs require('child_process').spawn(process.argv[0], ['path_to_child.js']) in order to start the child. Then if it needs to talk to the child, it uses the stdin and stdout of the child. stderr is piped to a log. I am guessing the answer would be yes?
| |
| | |
| *You can use pid-file. Something like that
| |
| | |
| <nowiki>var util = require('util'),
| |
| fs = require('fs'),
| |
| pidfile = '/var/run/nodemaster.pid';
| |
| | |
| try {
| |
| var pid = fs.readFileSync(pidfile);
| |
| //REPLACE with your signal or use another method to check process existence :)
| |
| process.kill(pid, 'SIGUSR2');
| |
| util.puts('Master already running');
| |
| process.exit(1);
| |
| } catch (e) {
| |
| fs.writeFileSync(pidfile, process.pid.toString(), 'ascii');
| |
| }
| |
| | |
| //run your childs here</nowiki>
| |
| | |
| ==Библиотеки==
| |
| ===Socket.IO===
| |
| | |
| Socket.IO is a Node.JS project that makes WebSockets and realtime possible in all browsers. It also enhances WebSockets by providing built-in multiplexing, horizontal scalability, automatic JSON encoding/decoding, and more.
| |
| | |
| '''Установка'''
| |
|
| |
|
| npm install socket.io
| | * '''устанавливаем postgresql''', читать тут [[PostgreSQL]] |
|
| |
|
| '''Использование''' | | * '''устанавливаем необходимые пакеты:''' |
| | echo "deb-src http://repo.zabbix.com/zabbix/3.4/debian stretch main" > /etc/apt/sources.list.d/zabbix.list |
| | wget -O - "http://repo.zabbix.com/zabbix-official-repo.key" | apt-key add - |
| | wget -O - "https://repo.zabbix.com/RPM-GPG-KEY-ZABBIX-79EA5ED4" | apt-key add - |
| | wget -O - "https://repo.zabbix.com/RPM-GPG-KEY-ZABBIX-A14FE591" | apt-key add - |
| | wget -O - "https://repo.zabbix.com/RPM-GPG-KEY-ZABBIX-A14FE591-EL5" | apt-key add - |
|
| |
|
| First, require socket.io:
| | apt-get update |
| | apt-get install zabbix-agent zabbix-frontend-php zabbix-proxy-pgsql zabbix-server-pgsql php-fpm nginx |
|
| |
|
| var io = require('socket.io'); | | * '''создаем администратора базы zabbix''' |
| | CREATE USER zabbixadmin WITH PASSWORD 'mypassword'; |
|
| |
|
| Next, attach it to a HTTP/HTTPS server. If you're using the fantastic express web framework:
| | * '''создаем базу данных для zabbix''' |
| | CREATE DATABASE "zabbix" |
| | WITH OWNER "zabbixadmin" |
| | ENCODING 'UTF8' |
| | LC_COLLATE = 'ru_RU.UTF-8' |
| | LC_CTYPE = 'ru_RU.UTF-8'; |
|
| |
|
| Express 3.x
| | * '''даем права на базу администратору''' |
| | GRANT ALL PRIVILEGES ON DATABASE "zabbix" to zabbixadmin; |
|
| |
|
| <nowiki>var app = express()
| | * '''теперь необходимо в эту базу загрузить шаблоны и схему (для postgresql)''' |
| , server = require('http').createServer(app)
| | zcat /usr/share/zabbix-server-pgsql/{schema,images,data}.sql.gz|psql -h 127.0.0.1 zabbix zabbixadmin |
| , io = io.listen(server);
| | '''{!}''' - для версии 3.4: |
| | zcat /usr/share/doc/zabbix-server-pgsql/create.sql.gz|psql -h 127.0.0.1 zabbix zabbixadmin |
|
| |
|
| server.listen(80);
| | * '''настраиваем php-fpm''' |
| | | cat /etc/php5/fpm/pool.d/www.conf |
| io.sockets.on('connection', function (socket) {
| | .... |
| socket.emit('news', { hello: 'world' });
| | ;listen = /var/run/php5-fpm.sock |
| socket.on('my other event', function (data) {
| | listen = 127.0.0.1:9000 |
| console.log(data);
| |
| });
| |
| });</nowiki>
| |
| | |
| | |
| Finally, load it from the client side code:
| |
| | |
| <nowiki><script src="/socket.io/socket.io.js"></script> | |
| <script>
| |
| var socket = io.connect('http://localhost');
| |
| socket.on('news', function (data) {
| |
| console.log(data);
| |
| socket.emit('my other event', { my: 'data' });
| |
| });
| |
| </script></nowiki>
| |
| | |
| For more thorough examples, look at the examples/ directory.
| |
| | |
| '''Примеры использования'''
| |
| | |
| Sending and receiving events.
| |
| | |
| Socket.IO allows you to emit and receive custom events. Besides connect, message and disconnect, you can emit custom events:
| |
| | |
| // note, io.listen(<port>) will create a http server for you | |
| var io = require('socket.io').listen(80);
| |
| | |
| io.sockets.on('connection', function (socket) {
| |
| io.sockets.emit('this', { will: 'be received by everyone' });
| |
| | |
| socket.on('private message', function (from, msg) {
| |
| console.log('I received a private message by ', from, ' saying ', msg);
| |
| });
| |
| | |
| socket.on('disconnect', function () {
| |
| io.sockets.emit('user disconnected');
| |
| });
| |
| });
| |
| Storing data associated to a client
| |
| | |
| Sometimes it's necessary to store data associated with a client that's necessary for the duration of the session.
| |
| | |
| Server side
| |
| | |
| var io = require('socket.io').listen(80);
| |
| | |
| io.sockets.on('connection', function (socket) {
| |
| socket.on('set nickname', function (name) {
| |
| socket.set('nickname', name, function () { socket.emit('ready'); });
| |
| });
| |
| | |
| socket.on('msg', function () {
| |
| socket.get('nickname', function (err, name) {
| |
| console.log('Chat message by ', name);
| |
| });
| |
| });
| |
| });
| |
| Client side
| |
| | |
| <script>
| |
| var socket = io.connect('http://localhost');
| |
| | |
| socket.on('connect', function () {
| |
| socket.emit('set nickname', prompt('What is your nickname?'));
| |
| socket.on('ready', function () {
| |
| console.log('Connected !');
| |
| socket.emit('msg', prompt('What is your message?'));
| |
| });
| |
| });
| |
| </script>
| |
| Restricting yourself to a namespace
| |
| | |
| If you have control over all the messages and events emitted for a particular application, using the default / namespace works.
| |
| | |
| If you want to leverage 3rd-party code, or produce code to share with others, socket.io provides a way of namespacing a socket.
| |
| | |
| This has the benefit of multiplexing a single connection. Instead of socket.io using two WebSocket connections, it'll use one.
| |
| | |
| The following example defines a socket that listens on '/chat' and one for '/news':
| |
| | |
| Server side
| |
| | |
| var io = require('socket.io').listen(80);
| |
| | |
| var chat = io
| |
| .of('/chat')
| |
| .on('connection', function (socket) {
| |
| socket.emit('a message', { that: 'only', '/chat': 'will get' });
| |
| chat.emit('a message', { everyone: 'in', '/chat': 'will get' });
| |
| });
| |
| | |
| var news = io | |
| .of('/news');
| |
| .on('connection', function (socket) {
| |
| socket.emit('item', { news: 'item' });
| |
| });
| |
| Client side:
| |
| | |
| <script>
| |
| var chat = io.connect('http://localhost/chat')
| |
| , news = io.connect('http://localhost/news');
| |
| | |
| chat.on('connect', function () {
| |
| chat.emit('hi!');
| |
| });
| |
| | |
| news.on('news', function () {
| |
| news.emit('woot');
| |
| });
| |
| </script>
| |
| Sending volatile messages.
| |
| | |
| Sometimes certain messages can be dropped. Let's say you have an app that shows realtime tweets for the keyword bieber.
| |
| | |
| If a certain client is not ready to receive messages (because of network slowness or other issues, or because he's connected through long polling and is in the middle of a request-response cycle), if he doesn't receive ALL the tweets related to bieber your application won't suffer.
| |
| | |
| In that case, you might want to send those messages as volatile messages.
| |
| | |
| Server side
| |
| | |
| var io = require('socket.io').listen(80);
| |
| | |
| io.sockets.on('connection', function (socket) {
| |
| var tweets = setInterval(function () {
| |
| getBieberTweet(function (tweet) {
| |
| socket.volatile.emit('bieber tweet', tweet);
| |
| });
| |
| }, 100);
| |
| | |
| socket.on('disconnect', function () {
| |
| clearInterval(tweets);
| |
| });
| |
| });
| |
| Client side
| |
| | |
| In the client side, messages are received the same way whether they're volatile or not.
| |
| | |
| Getting acknowledgements
| |
| | |
| Sometimes, you might want to get a callback when the client confirmed the message reception.
| |
| | |
| To do this, simply pass a function as the last parameter of .send or .emit. What's more, when you use .emit, the acknowledgement is done by you, which means you can also pass data along:
| |
| | |
| Server side
| |
| | |
| var io = require('socket.io').listen(80);
| |
| | |
| io.sockets.on('connection', function (socket) {
| |
| socket.on('ferret', function (name, fn) {
| |
| fn('woot');
| |
| });
| |
| });
| |
| Client side
| |
| | |
| <script>
| |
| var socket = io.connect(); // TIP: .connect with no args does auto-discovery
| |
| socket.on('connect', function () { // TIP: you can avoid listening on `connect` and listen on events directly too!
| |
| socket.emit('ferret', 'tobi', function (data) {
| |
| console.log(data); // data will be 'woot'
| |
| });
| |
| });
| |
| </script>
| |
| Broadcasting messages
| |
| | |
| To broadcast, simply add a broadcast flag to emit and send method calls. Broadcasting means sending a message to everyone else except for the socket that starts it.
| |
| | |
| Server side
| |
| | |
| var io = require('socket.io').listen(80);
| |
| | |
| io.sockets.on('connection', function (socket) {
| |
| socket.broadcast.emit('user connected');
| |
| socket.broadcast.json.send({ a: 'message' });
| |
| });
| |
| Rooms
| |
| | |
| Sometimes you want to put certain sockets in the same room, so that it's easy to broadcast to all of them together.
| |
| | |
| Think of this as built-in channels for sockets. Sockets join and leave rooms in each socket.
| |
| | |
| Server side
| |
| | |
| var io = require('socket.io').listen(80);
| |
| | |
| io.sockets.on('connection', function (socket) {
| |
| socket.join('justin bieber fans');
| |
| socket.broadcast.to('justin bieber fans').emit('new fan');
| |
| io.sockets.in('rammstein fans').emit('new non-fan');
| |
| });
| |
| Using it just as a cross-browser WebSocket
| |
| | |
| If you just want the WebSocket semantics, you can do that too. Simply leverage send and listen on the message event:
| |
| | |
| Server side
| |
| | |
| var io = require('socket.io').listen(80);
| |
| | |
| io.sockets.on('connection', function (socket) {
| |
| socket.on('message', function () { });
| |
| socket.on('disconnect', function () { });
| |
| });
| |
| Client side
| |
| | |
| <script>
| |
| var socket = io.connect('http://localhost/');
| |
| socket.on('connect', function () {
| |
| socket.send('hi');
| |
| | |
| socket.on('message', function (msg) {
| |
| // my msg
| |
| });
| |
| });
| |
| </script>
| |
| Changing configuration
| |
| | |
| Configuration in socket.io is TJ-style:
| |
| | |
| Server side
| |
| | |
| var io = require('socket.io').listen(80);
| |
| | |
| io.configure(function () {
| |
| io.set('transports', ['websocket', 'flashsocket', 'xhr-polling']);
| |
| });
| |
| | |
| io.configure('development', function () {
| |
| io.set('transports', ['websocket', 'xhr-polling']);
| |
| io.enable('log');
| |
| });
| |
| ====Перевод документации с оф. сайта====
| |
| '''Использование Node HTTP server'''
| |
| | |
| Установить npm install socket.io
| |
| | |
| '''''SERVER (APP.JS)'''''
| |
| | |
| <nowiki>var app = require('http').createServer(handler)
| |
| , io = require('socket.io').listen(app)
| |
| , fs = require('fs')
| |
|
| |
| app.listen(80);
| |
| | | |
| function handler (req, res) { | | .... |
| fs.readFile(__dirname + '/index.html',
| |
| function (err, data) {
| |
| if (err) {
| |
| res.writeHead(500);
| |
| return res.end('Error loading index.html');
| |
| }
| |
| res.writeHead(200);
| |
| res.end(data);
| |
| });
| |
| }
| |
| | | |
| io.sockets.on('connection', function (socket) { | | cat /etc/php5/fpm/php.ini |
| socket.emit('news', { hello: 'world' });
| | .... |
| socket.on('my other event', function (data) {
| | disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,<br>pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,<br>pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, |
| console.log(data);
| | .... |
| });
| | date.timezone = Europe/Moscow |
| });</nowiki> | | .... |
| | | max_execution_time = 300 |
| '''''CLIENT (INDEX.HTML)'''''
| | .... |
| | | post_max_size = 16M |
| <nowiki><script src="/socket.io/socket.io.js"></script> | | .... |
| <script> | | always_populate_raw_post_data = -1 |
| var socket = io.connect('http://localhost');
| | .... |
|
| |
| socket.on('news', function (data) {
| |
| console.log(data);
| |
| socket.emit('my other event', { my: 'data' });
| |
| });
| |
| </script></nowiki> | |
|
| |
|
| '''Использование совместно с Express 3 web framework''' | | * '''(!)''' - возможно '''zabbix''' при первом запуске еще что-то попросит, измените как будет указано. |
|
| |
|
| Express 3 requires that you instantiate a `http.Server` to attach socket.io to first:
| | * '''nginx''' - пример наcтройки для '''zabbix''': |
|
| |
|
| | | server { |
| '''''SERVER (APP.JS)'''''
| | listen 10.0.1.40:88; |
| | | server_name zabbix; |
| var app = require('express')()
| | root /home/www/zabbix; |
| , server = require('http').createServer(app)
| | location / { |
| , io = require('socket.io').listen(server); | | index index.html index.php; |
| | } |
| | | |
| server.listen(80);
| | location ~* \.(gif|jpg|png)$ { |
| | expires 30d; |
| | } |
| | | |
| app.get('/', function (req, res) {
| | location ~ \.php$ { |
| res.sendfile(__dirname + '/index.html');
| | fastcgi_pass localhost:9000; |
| }); | | fastcgi_param SCRIPT_FILENAME |
|
| | $document_root$fastcgi_script_name; |
| io.sockets.on('connection', function (socket) {
| | include fastcgi_params; |
| socket.emit('news', { hello: 'world' });
| | } |
| socket.on('my other event', function (data) {
| | } |
| console.log(data);
| |
| });
| |
| }); | |
|
| |
|
| '''''CLIENT (INDEX.HTML)''''' | | =='''Полезные советы'''== |
| | * '''Проблема:''' Триггер с элементом vm.memory.size |
| | Пытаюсь мониторить переполнение RAM (если меньше 10% свободной RAM в течении 5 минут) и создаю триггер: |
| | {hostname:vm.memory.size[available].last(5m)}<10 |
| | Однако ничего не происходит. |
|
| |
|
| <nowiki><script src="/socket.io/socket.io.js"></script> | | * '''Решение:''' |
| <script>
| | Вам для вашей задачи лучше использовать функцию max() |
| var socket = io.connect('http://localhost'); | | {hostname:vm.memory.size[pavailable].max(5m)}<10 |
|
| | * [https://www.zabbix.com/forum/in-russian/46020-%D0%A2%D1%80%D0%B8%D0%B3%D0%B3%D0%B5%D1%80-%D1%81-%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%BC-vm-memory-size источник] |
| socket.on('news', function (data) {
| | '''Пример:''' {Zabbix server:vm.memory.size[available].max(5m)}<10 |
| console.log(data);
| | <hr> |
| socket.emit('my other event', { my: 'data' });
| |
| });
| |
| </script></nowiki>
| |
|
| |
|
| '''Использование совместно с Express web framework''' | | * '''Проблема:''' Если постоянно выскакивает предупреждение на триггер Disk I/O is overloaded on |
| | {Zabbix server:system.cpu.util[,iowait].last(0)}>20 |
| | Получается, что ожидает операции ввода.вывода более 20 сек ? |
|
| |
|
| You can serve normal pages and AJAX requests with Express, and attach your socket.io server
| | * '''Решение:''' Cоветую увеличить интервал и также путем увелечинеия памяти! |
| | [https://www.zabbix.com/forum/zabbix-help/36397-disk-i-o-is-overloaded-on-zabbix-server/page2?t=44382&highlight=Disk+I/O+overloaded&page=2 Вот здесь совет] |
| | Пример: {Zabbix server:system.cpu.util[,iowait].avg(5m)}>30 |
| | <hr> |
|
| |
|
| For this example, simply run `npm install socket.io express`
| | * '''Проблема:''' Zabbix discoverer processes more than 75% busy |
| | |
| '''''SERVER (APP.JS)''''' | |
| | |
| var app = require('express').createServer()
| |
| , io = require('socket.io').listen(app);
| |
| app.listen(80);
| |
| app.get('/', function (req, res) {
| |
| res.sendfile(__dirname + '/index.html');
| |
| });
| |
| io.sockets.on('connection', function (socket) {
| |
| socket.emit('news', { hello: 'world' });
| |
| socket.on('my other event', function (data) {
| |
| console.log(data);
| |
| });
| |
| });
| |
| | |
| '''''CLIENT (INDEX.HTML)'''''
| |
| | |
| <nowiki><script src="/socket.io/socket.io.js"></script>
| |
| <script>
| |
| var socket = io.connect('http://localhost');
| |
| socket.on('news', function (data) {
| |
| console.log(data);
| |
| socket.emit('my other event', { my: 'data' });
| |
| });
| |
| </script></nowiki>
| |
| | |
| '''Отправка и прием событий.'''
| |
| | |
| Socket.IO позволяет обрабатывать и отправлять произвольные события. Кроме `connect`, `message` and `disconnect`, можно создавать произвольные события:
| |
| | |
| '''''SERVER'''''
| |
| | |
| // note, io.listen(<port>) will create a http server for you
| |
| var io = require('socket.io').listen(80);
| |
| io.sockets.on('connection', function (socket) {
| |
| io.sockets.emit('this', { will: 'be received by everyone'});
| |
| socket.on('private message', function (from, msg) {
| |
| console.log('I received a private message by ', from, ' saying ', msg);
| |
| });
| |
| socket.on('disconnect', function () {
| |
| io.sockets.emit('user disconnected');
| |
| });
| |
| });
| |
| | |
| '''Прикрепление данных, ассоциированных с клиентом'''
| |
| | |
| Иногда необходимо хранить данные, ассоциированные с клиентом, что необходимо для продолжении (duration) сессии.
| |
| | |
| '''''SERVER'''''
| |
| <nowiki>var io = require('socket.io').listen(80);
| |
| io.sockets.on('connection', function (socket) {
| |
| socket.on('set nickname', function (name) {
| |
| socket.set('nickname', name, function () {
| |
| socket.emit('ready');
| |
| });
| |
| });
| |
| socket.on('msg', function () {
| |
| socket.get('nickname', function (err, name) {
| |
| console.log('Chat message by ', name);
| |
| });
| |
| });
| |
| });
| |
| </nowiki>
| |
| '''''CLIENT'''''
| |
| <nowiki><script src="/socket.io/socket.io.js"></script>
| |
| <script>
| |
| var socket = io.connect('http://localhost');
| |
| socket.on('news', function (data) {
| |
| console.log(data);
| |
| socket.emit('my other event', { my: 'data' });
| |
| });
| |
| </script></nowiki>
| |
| | |
| '''Оборачивание себя (своего кода) в namespace.'''
| |
| | |
| Если вы контролируете все сообщения и события в коде, используйте namespace works по умолчанию (default namespace works)
| |
| Если вы хотите использовать сторонний код или предоставлять код другим, socket.io предоставляет возможность использования именованных сокетов (namespacing a socket.)
| |
| | |
| Это полезно при мультиплексировании соединений. Вместо использования двух соединений WebSocket, будет использовано одно.
| |
| | |
| ''''SERVER'''''
| |
| | |
| <nowiki>var io = require('socket.io').listen(80);
| |
| | |
| var chat = io
| |
| .of('/chat')
| |
| .on('connection', function (socket) {
| |
| socket.emit('a message', {
| |
| that: 'only'
| |
| , '/chat': 'will get'
| |
| });
| |
| chat.emit('a message', {
| |
| everyone: 'in'
| |
| , '/chat': 'will get'
| |
| });
| |
| });
| |
| | |
| var news = io
| |
| .of('/news')
| |
| .on('connection', function (socket) {
| |
| socket.emit('item', { news: 'item' });
| |
| });</nowiki>
| |
| '''''CLIENT'''''
| |
| | |
| <nowiki><script>
| |
| var chat = io.connect('http://localhost/chat')
| |
| , news = io.connect('http://localhost/news');
| |
| | | |
| chat.on('connect', function () {
| | * '''Решение:''' Этот процесс используется при обнаружении устройств в сети. |
| chat.emit('hi!');
| | Проверьте и в случае необходимости, подправьте настройки правил обнаружения или увеличьте количество процессов которые |
| });
| | занимаются обнаружением новых устройств (параметр StartDiscoverers в конфиг файле zabbix сервера). |
|
| | К пингу этот процесс и триггер отношения не имеют. |
| news.on('news', function () {
| | Если не нужен, то и не запускайте обнаружения. Если нужен, то поставьте 2. Посмотрите на графике динамику изменения. |
| news.emit('woot');
| | Если всё равно нагрузка будет большая, поставьте 3. Ну и так далее. |
| });
| |
| </script></nowiki>
| |
| | |
| '''Отправка летучих (volatile) сообщений.'''
| |
| | |
| Иногда некоторые сообщения могут быть удалены (отброшены). Скажем, у вас есть приложение, которое показывает в реальном времени количество твитов по ключевому слову Бибер.
| |
| | |
| Если определенный клиент не готов к приему сообщений (из-за медлительности сети или других вопросов, или потому, что он связан через длинные голосования и находится в середине запрос-ответ цикла), если он не получит всех твитов, связанных с Бибер, то ваша заявка не будет страдать.
| |
| | |
| В этом случае, вы можете отправить эти сообщения, как летучие сообщений.
| |
| | |
| '''''SERVER'''''
| |
| | |
| <nowiki>var io = require('socket.io').listen(80); | |
| | |
| io.sockets.on('connection', function (socket) {
| |
| var tweets = setInterval(function () {
| |
| getBieberTweet(function (tweet) {
| |
| socket.volatile.emit('bieber tweet', tweet);
| |
| });
| |
| }, 100);
| |
| | |
| socket.on('disconnect', function () {
| |
| clearInterval(tweets);
| |
| });
| |
| });</nowiki>
| |
| | |
| '''Отправка и получение данных (подтверждения)'''
| |
| | |
| Иногда, вы можете получить обратный вызов, когда клиент подтвердил прием сообщения.
| |
| | |
| Чтобы сделать это, просто передать функцию в качестве последнего параметра `.send` или `.emit`. Более того, когда вы используете `.emit`, подтверждение было сделано вами, значит, вы также можете продолжить передавать данные.
| |
| | |
| '''''SERVER'''''
| |
| | |
| <nowiki>var io = require('socket.io').listen(80);
| |
| | |
| io.sockets.on('connection', function (socket) {
| |
| socket.on('ferret', function (name, fn) {
| |
| fn('woot');
| |
| });
| |
| });</nowiki>
| |
| | |
| '''''CLIENT'''''
| |
| | |
| <nowiki><script>
| |
| var socket = io.connect(); // TIP: .connect with no args does auto-discovery
| |
| socket.on('connect', function () { // TIP: you can avoid listening on `connect` and listen on events directly too!
| |
| socket.emit('ferret', 'tobi', function (data) {
| |
| console.log(data); // data will be 'woot'
| |
| });
| |
| });
| |
| </script></nowiki> | |
| | |
| '''Broadcasting messages.'''
| |
| | |
| To broadcast, simply add a `broadcast` flag to `emit` and `send` method calls. Broadcasting means sending a message to everyone else except for the socket that starts it.
| |
| | |
| '''''SERVER'''''
| |
| | |
| <nowiki>var io = require('socket.io').listen(80); | |
| | |
| io.sockets.on('connection', function (socket) {
| |
| socket.broadcast.emit('user connected');
| |
| });</nowiki>
| |
| | |
| '''Using it just as a cross-browser WebSocket.'''
| |
| | |
| If you just want the WebSocket semantics, you can do that too. Simply leverage `send` and listen on the `message` event:
| |
| | |
| '''''SERVER'''''
| |
| | |
| <nowiki>var io = require('socket.io').listen(80);
| |
| | |
| io.sockets.on('connection', function (socket) {
| |
| socket.on('message', function () { });
| |
| socket.on('disconnect', function () { });
| |
| });</nowiki>
| |
| | |
| '''''CLIENT'''''
| |
| | |
| <nowiki><script> | |
| var socket = io.connect('http://localhost/');
| |
| socket.on('connect', function () {
| |
| socket.send('hi');
| |
| | |
| socket.on('message', function (msg) {
| |
| // my msg
| |
| });
| |
| });
| |
| </script></nowiki>
| |
| | |
| ====Примеры кода====
| |
| | |
| http://kuroikaze85.wordpress.com/2010/06/15/socket-io-node-js-game-making/
| |
| [http://www.ibm.com/developerworks/ru/library/cl-nodejscloud/ Применение Node.js в качестве полной среды разработки для облачных решений]
| |
| <hr> | | <hr> |
| ==Официальная документция==
| |
|
| |
|
| |
| * [http://nodejs.org/api/modules.html nodejs.org]
| |
|
| |
| * [http://nodeguide.ru/doc/ Руководства по Node.js от Felix’а]
| |
|
| |
| * [http://nodebeginner.ru/ Руководства по Node.js упрощенное...]
| |
|
| |
| * [http://vremenno.net/js/node-js-for-beginners/ примеры начинающим]
| |
|
| |
| ==АКСИОМЫ NODE.JS==
| |
| Callback-driven парадигма
| |
|
| |
| Неблокирующая функция принимает callback последним аргументом:
| |
|
| |
| <nowiki>function asuncFunction(arg1,arg2,...,argN, callback){
| |
|
| |
| }</nowiki>
| |
|
| |
| Callback принимает ошибку первым аргументом, остальные результат:
| |
|
| |
| <nowiki>function callback(error, result1,result2,...resultN){
| |
|
| |
| }</nowiki>
| |
|
| |
| ==Кластер==
| |
| [[Кластер на основе NodeJS]] -
| |
|
| |
| ==Примеры архитектуры==
| |
| [[Tactoom.com изнутри — социальная блог-платформа на NodeJS/NoSQL]]
| |
|
| |
| ==Обработка форм и визуализации через NodeJs==
| |
|
| |
| [http://nodejs.ru/665]http://nodejs.ru/665
| |
|
| |
| [http://habrahabr.ru/post/138629/]http://habrahabr.ru/post/138629/
| |
|
| |
| [http://nodeguide.ru/doc/dailyjs-nodepad/node-tutorial-7/]http://nodeguide.ru/doc/dailyjs-nodepad/node-tutorial-7/
| |
|
| |
| [http://habrahabr.ru/post/147571/]http://habrahabr.ru/post/147571/
| |
|
| |
| [http://www.pvsm.ru/node-js/12212]http://www.pvsm.ru/node-js/12212
| |
|
| |
| [http://www.pixelcom.crimea.ua/rukovodstvo-po-html5-canvas.html]http://www.pixelcom.crimea.ua/rukovodstvo-po-html5-canvas.html
| |
|
| |
| :[[Установка node.js в Debian]]
| |
|
| |
| *Express: веб-фреймворк для Node.js. Руководство пользователя
| |
| [http://jsman.ru/express/]http://jsman.ru/express/
| |
|
| |
| * Руководство для начинающих
| |
| [http://vremenno.net/js/node-js-for-beginners/]http://vremenno.net/js/node-js-for-beginners/
| |
|
| |
| *Скелет приложения на Node.js с использованием express, mongoose, backbone.js, socket.io
| |
| [http://kulakowka.com/tag/express/]http://kulakowka.com/tag/express/
| |
|
| |
| *Русскоязычное сообщество Node.js
| |
| [http://forum.nodejs.ru/index.php?topic=130.0]http://forum.nodejs.ru/index.php?topic=130.0
| |
|
| |
| *[http://www.pvsm.ru/node-js/16286 Установка node.js на VPS]
| |
|
| |
| ==Технологии спутники==
| |
| Перечень модулей для Node.js https://github.com/joyent/node/wiki/modules
| |
| ===Node-sync===
| |
| [[Node-sync_—_псевдо-синхронное_программирование_на_nodejs_с_использованием_fibers]]
| |
| ===socket.io===
| |
| * [http://socket.io/ socket.io] [[socket.io документация]]
| |
| * [http://blog.denivip.ru/index.php/2012/11/разработка-высокопроизводительных-с/ webSocketServer ru]
| |
|
| |
| ===Express===
| |
| *[http://jsman.ru/express/#quickstart Express: веб-фреймворк для Node.js. Руководство пользователя][[Express: веб-фреймворк для Node.js. Руководство пользователя|Сохраненная копия]]
| |
|
| |
| ==Отладка и сборка==
| |
| *[http://nodejs.ru/324 Отладчик ndb]
| |
| *[http://jsman.ru/2012/08/24/browserify.html Browserify - cобираем JS-проект]
| |
| *[[JavaScript Strict Mode]]
| |
|
| |
|
| ==Примеры кода==
| | * Проблема: zabbix win 7 cannot make counterpath for "\\": [0xC0000BBD] Обязательный аргумент пропущен или указан неправильно. |
| ===Цепочка вызывающих себя через callback'и функций с передачей данных следующей функции (обработка ошибок в одном месте, массив функций в качестве параметра)===
| | * Решение: |
| | cmd |
| | lodctr /r |
| | * взято [https://serveradmin.ru/zabbix-init_cpu_collector-cannot-make-counterpath/ тут] |
|
| |
|
| С использованием async это пишется так:
| |
|
| |
|
| <nowiki>var async = require('async');
| |
|
| |
| async.waterfall([
| |
| function(callback){
| |
| setTimeout(function() {
| |
| console.log('f1 done');
| |
| callback(null, 'data from f1');
| |
| }, 100);
| |
| },
| |
| function(data, callback){
| |
| // работа с data
| |
| // или расширение цепочки через функцию f3, которая по окончании работы вызовет callback
| |
| // f3(callback);
| |
| console.log('f2 done');
| |
| callback(null, 'done');
| |
| }
| |
| ], function (err, result) {
| |
| // result now equals 'done'
| |
| if (err) {
| |
| // единое место для отлова ошибок
| |
| }
| |
| console.log(result);
| |
| });</nowiki>
| |
|
| |
| == Дополнительные возможности nodejs ==
| |
|
| |
| * [http://docs.nodejitsu.com/articles/child-processes/how-to-spawn-a-child-process вызов сторонних команд]
| |
|
| |
| == Полезные ресурсы ==
| |
| * [http://nodejs.org/download/ node.js]
| |
| * [http://nodejs.ru/707 коротко о всех командах node.js]
| |
|
| |
| * [http://www.askdev.ru/blog/nodejs/54/Отличное-руководство-для-начинающих-по-Node-js/ полезное на старте.]
| |
| * [http://vremenno.net/js/node-js-for-beginners/ примеры кода]
| |
| * [http://habrahabr.ru/post/102717/ примеры с Хабра]
| |
| * [http://drumcoder.co.uk/blog/2011/jan/10/nodejs-phone-book/ пример работы с postgresql]
| |
|
| |
| * [http://jade-lang.com/ .. не все понял но здорово.."шаблнизатор"]
| |
| * [https://github.com/visionmedia/jade#readme описание шаблонизатора..]
| |
| * [http://www.mongodb.org/ база данных под node.js]
| |
| * [http://www.pvsm.ru/web-razrabotka/2198/print/ то что нужно знать!]
| |
| * [http://www.slideshare.net/yurabogdanov/nodejs-8223169 профи советы]
| |
| * [http://habrahabr.ru/post/130345/ чужой опыт...]
| |
| * [http://habrahabr.ru/post/138071/ еще чужой опыт...]
| |
| <hr>
| |
| ''''''Отладка в Node.Js''''''
| |
| * [https://github.com/ajaxorg/cloud9 среда разработки для node.js]
| |
| * [https://github.com/dannycoates/node-inspector отлачик для node.js]
| |
| * [http://habrahabr.ru/post/114825/ использование node-inspector]
| |
| * [http://nodejs.ru/doc/v0.4.x/debugger.html встроенный отладчик]
| |
| * [http://nodejs.ru/324 Ndb отладка в node]
| |
| <hr> | | <hr> |
| * [[Node.js debian init.script]]
| | '''ИСТОЧНИКИ:''' |
| <hr> | | <hr> |
| '''''@модули для node.js''''' | | * [https://serveradmin.ru/ustanovka-i-nastroyka-zabbix-3-4-na-debian-9/#_Zabbix_34_Debian_9 Установка сервера Zabbix 3.4 на Debian 9] |
| * [http://thechangelog.com/stylus-expressive-robust-feature-rich-css-language/ stylus - работа со стилями через nod.js] | | * [https://blog.vpsville.ru/blog/pro/61.html Установка службы Zabbix - агент на Windows сервер.] |
| | * [http://jakondo.ru/ustanovka-i-nastrojka-zabbix-agentov-na-os-windows-i-linux-ubuntu-debian/ Установка и настройка Zabbix агентов на ОС Windows и Linux (Ubuntu, Debian)] |
| | * [http://www.ekzorchik.ru/2015/01/install-zabbix-agent-on-windows-7/ Установить Zabbix агент на Windows 7] |
| | * [http://www.ekzorchik.ru/2015/01/how-to-install-zabbix-agent-on-windows-xp/ Как установить Zabbix агент на Windows XP] |
| | * [http://www.suiviperf.com/zabbix/ '''ZABBIX AGENT installers'''] |
| | * [https://www.zabbix.com/documentation/3.0/ru/manual/quickstart/notification Получение оповещения о проблеме] |
| | * [https://serveradmin.ru/nastroyka-email-opoveshheniy-v-zabbix/ Отправка email уведомлений в zabbix 2.4] |
| | * [https://habrahabr.ru/company/zabbix/blog/193472/ Zabbix тюнинг] |
| | * [http://blog.files.dp.ua/zabbix-trigger Решение проблем с триггерами processes more than 75% busy] |
| | * [http://linux-notes.org/optimizatsiya-nastroek-zabbix/ Оптимизация настроек Zabbix] |