imported>Vix |
|
(не показано 87 промежуточных версий 2 участников) |
Строка 1: |
Строка 1: |
| process.nextTick(callback) - Гарантированно вызовет функцию callback в следующем цикле eventloop
| | ==ВВЕДЕНИЕ== |
| | '''Node.js''' представляет среду выполнения кода на '''JavaScript''', которая построена на основе движка '''JavaScript''' '''Chrome V8''', который позволяет транслировать вызовы на языке '''JavaScript''' в машинный код. '''Node.js''' прежде всего предназначен для создания серверных приложений на языке '''JavaScript'''. Хотя также существуют проекты по написанию десктопных приложений (Electron) и даже по созданию кода для микроконтроллеров. Но прежде всего мы говорим о '''Node.js''', как о платформе для создания веб-приложений.<br> |
| | Особенностью '''Node.js''' является то, что '''Node.js''' использует один (основной) поток, который получает все запросы и управляет ими через очередь запросов (таким образом, '''Node.js''' является однопоточным сервером). Внутри этого потока выполняется так называемый цикл событий ('''event loop'''), который представляет собой цикл, который непрерывно проверяет запросы из очереди событий и обрабатывает события ввода и вывода.<br> |
| | Если пользователь отправляет запрос на сервер '''Node.js''', в цикле событий выполняется проверка, чтобы определить, требует ли следующий запрос блокирующей операции ввода или вывода (например, обращение к базе данных или файловой системе). Если нет, то запрос обрабатывается напрямую, и пользователю отправляется результат обработки.<br> |
| | Если же запрос требует блокирующей операции ввода/вывода, для выполнения этой операции запускается один из нескольких внутренних обработчиков '''Node.js''' (потоков). В обработчики передается функция обратного вызова, которая, в свою очередь, вызывается, как только будет выполнена блокирующая операция ввода/вывода.<br> |
| | При этом основной поток не останавливается во время блокирующих операций ввода/вывода: цикл событий постоянно совершает свои обходы, проверяет новые запросы и так далее. Благодаря этой архитектуре Node.js предотвращает создание все большего количества потоков и чрезмерного использования памяти.<br> |
| | Платформу разработал [https://ru.wikipedia.org/wiki/%D0%94%D0%B0%D0%BB%D1%8C,_%D0%A0%D0%B0%D0%B9%D0%B0%D0%BD '''Райан Даль'''], программист из Америки, в 2009 году. До появления '''Node.js''' приложения, которые написаны на языке программирования '''JavaScript''', можно было запускать только в браузере. С появлением платформы стало возможно писать на JavaScript не только в браузере, но и на сервере.<br> |
| | '''Node.js''' является открытым проектом, исходники которого можно посмотреть на [https://github.com/nodejs github.com]. |
|
| |
|
| ==Серверный JavaScript== | | ==АРХИТЕКТУРА== |
| [[Руководство NodeJS]] | | '''Node.js''' работает на движке '''V8''', транслирующем '''JavaScript''' в машинный код. Простыми словами, '''Node.js''' — это приложение на '''C++''', которое получает на входе код '''JavaScript''' и выполняет его. Чтобы взаимодействовать с устройствами ввода-вывода на компьютере, в платформе предусмотрен собственный интерфейс на '''C++'''. Таким образом, платформа превращает специализированный скриптовый язык '''JavaScript''' в язык общего назначения, поэтому на '''Node.js''' можно писать любые компьютерные программы. Платформа позволяет пользоваться единым языком '''JavaScript''' для написания кода и на стороне клиента ('''Frontend'''), и на сервере ('''Backend'''). Эти возможности '''Node.js''' важны для разработки приложений реального времени, которые основаны на событиях. |
| [[Node.js Virtual Machine (vm) Usage (перевод)]] | | ==УСТАНОВКА И IDE== |
| ===Node.JS Parent Process ID===
| | * [[Установка node.js в Debian]] |
| 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.
| | * [https://vscode-docs.readthedocs.io/en/latest/runtimes/nodejs/ Node.js Applications with VS Code] |
| | * [https://github.com/microsoft/vscode-docs/blob/main/docs/nodejs/nodejs-tutorial.md vscode-docs] |
| | * [https://translated.turbopages.org/proxy_u/en-ru.ru.dad9deda-66a13eb8-24112291-74722d776562/https/www.freecodecamp.org/news/how-to-get-started-debugging-nodejs-applications-with-ndb-a37e8747dbba How to get started debugging NodeJS applications with ndb] |
| | * [https://nodejs.org/api/debugger.html Debugger] |
| | * [https://github.com/node-inspector/node-inspector Node Inspector] |
| | ** [https://habr.com/ru/articles/114825/ Удаленная отладка Node.js приложений и кода на WebKit браузерах] |
|
| |
|
| 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?
| | * [https://metanit.com/web/nodejs/1.2.php Первое приложение на Node.js] |
| | | * [https://www.demo2s.com/node.js/node.js.html Node.js Tutorial] |
| *You can use pid-file. Something like that
| | * [https://nodejs.org/api/synopsis.html Usage and example] |
| | | * [https://www.geeksforgeeks.org/node-js-examples/ Node.js Examples] |
| <nowiki>var util = require('util'),
| | * [https://habr.com/ru/articles/245775/ Выразительный JavaScript: Node.js] |
| fs = require('fs'),
| | * [[JavaScript Strict Mode]] |
| pidfile = '/var/run/nodemaster.pid';
| | * [https://webformyself.com/node-js-masshtabirovanie-prilozheniya-s-pomoshhyu-child_process/ Node.js — Масштабирование приложения с помощью child_process] |
| | | * [[Node js & Подключение модулей без явного использования require или аналог namespace]] |
| try {
| | * [https://habr.com/ru/articles/102717/ Node.JS — Основы асинхронного программирования, часть 1] |
| var pid = fs.readFileSync(pidfile);
| | * [[Node.js debian init.script]] |
| //REPLACE with your signal or use another method to check process existence :)
| | * [[Daemon init script for node.js based app/server (DEBIAN/UBUNTU)]] |
| process.kill(pid, 'SIGUSR2');
| | * [https://www.codementor.io/@codementorteam/how-to-use-json-files-in-node-js-85hndqt32 How to Use JSON files in Node.js] |
| util.puts('Master already running');
| | * [[Nodejs - Использование MD5]] |
| process.exit(1);
| | * [[Получить MAC-адрес текущего компьютера с node.js]] |
| } catch (e) {
| | * [https://stackoverflow.com/questions/5878682/node-js-hash-string node.js hash string?] |
| fs.writeFileSync(pidfile, process.pid.toString(), 'ascii');
| | * [https://habr.com/post/217901/ Node.js, Require и Exports] |
| }
| |
| | |
| //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
| |
| | |
| '''Использование'''
| |
| | |
| First, require socket.io:
| |
| | |
| var io = require('socket.io');
| |
| | |
| Next, attach it to a HTTP/HTTPS server. If you're using the fantastic express web framework:
| |
| | |
| Express 3.x
| |
| | |
| <nowiki>var app = express()
| |
| , server = require('http').createServer(app)
| |
| , io = io.listen(server);
| |
| | |
| server.listen(80);
| |
| | |
| io.sockets.on('connection', function (socket) {
| |
| socket.emit('news', { hello: 'world' });
| |
| socket.on('my other event', function (data) {
| |
| 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) {
| |
| socket.emit('news', { hello: 'world' });
| |
| socket.on('my other event', function (data) {
| |
| console.log(data);
| |
| });
| |
| });</nowiki>
| |
| | |
| '''''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>
| |
| | |
| '''Использование совместно с Express 3 web framework'''
| |
| | |
| Express 3 requires that you instantiate a `http.Server` to attach socket.io to first:
| |
| | |
| | |
| '''''SERVER (APP.JS)'''''
| |
| | |
| var app = require('express')()
| |
| , server = require('http').createServer(app)
| |
| , io = require('socket.io').listen(server);
| |
|
| |
| server.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>
| |
| | |
| '''Использование совместно с Express web framework'''
| |
| | |
| You can serve normal pages and AJAX requests with Express, and attach your socket.io server
| |
| | |
| For this example, simply run `npm install socket.io express`
| |
| | |
| '''''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!');
| |
| });
| |
|
| |
| news.on('news', function () {
| |
| news.emit('woot');
| |
| });
| |
| </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 в качестве полной среды разработки для облачных решений] | | * [[Кластер на основе NodeJS]] |
| <hr>
| | * [[Tactoom.com изнутри — социальная блог-платформа на NodeJS/NoSQL]] |
| ==Официальная документция==
| | * [https://ru.hexlet.io/blog/posts/luchshie-praktiki-napisaniya-prilozheniy-na-nodejs 10 лучших практик написания приложений на NodeJS] |
| | * [https://habr.com/ru/companies/vk/articles/255895/ 10 основных ошибок при разработке на Node.js] |
| | ** [https://proglib.io/p/10-node-errors 10 главных ошибок, которые совершают Node-разработчики] |
| | ** [https://makeomatic.ru/blog/2015/05/25/10_mistakes_2_node/ 10 типичных ошибок Node.js разработчиков] |
|
| |
|
| | ==БИБЛИОТЕКА== |
| | * [[Руководство NodeJS]] |
| | * [[Node.js Virtual Machine (vm) Usage (перевод)]] |
| | * [[NodeJs - socket.io]] |
| | * [[Express: веб-фреймворк для Node.js. Руководство пользователя]] |
| | * [[Node-sync_—_псевдо-синхронное_программирование_на_nodejs_с_использованием_fibers]] |
| | * [[Socket.io документация]] |
|
| |
|
| * [http://nodejs.org/api/modules.html nodejs.org] | | ==OnLine БИБЛИОТЕКА== |
| | * [https://habr.com/ru/companies/ruvds/articles/422893/ Руководство по Node.js] |
| | * [https://habr.com/ru/articles/572968/ Генерация документации с использованием JSDoc] |
| | ** [https://www.npmjs.com/package/jsdoc2 jsdoc2 npm] |
| | ** [https://www.demo2s.com/node.js/node-js-jsdoc-an-api-documentation-generator-for-javascript.html Node.js jsdoc An API documentation generator for JavaScript.] |
| | * [https://habr.com/ru/articles/138071/ Разработка WEB-проекта на Node.JS] |
| | ** [https://habr.com/ru/articles/138629/ Разработка WEB-проекта на Node.JS: Часть 2] |
| | * [https://habr.com/ru/articles/147571/ Moqups — новый сервис для создания макетов UI] |
| | * [https://www.pvsm.ru/node-js/12212 Централизованная обработка исключений в Node.JS] |
| | * [https://changelog.com/posts/node-canvas-render-and-stream-html5-canvas-using-node-js node-canvas – render and stream HTML5 canvas using Node.js] |
| | * [https://developer.mozilla.org/ru/docs/Learn/Server-side/Express_Nodejs Веб-фреймворк Express (Node.js/JavaScript)] |
| | * [https://www.pvsm.ru/node-js/16286 Установка node.js на VPS] |
| | * [https://www.cyberforum.ru/nodejs/ Forum Node.js] |
| | * [https://habr.com/ru/articles/314394/ Делаем проект на Node.js с использованием Mongoose, Express, Cluster.] |
| | * [http://blog.denivip.ru/index.php/2012/11/%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0-%D0%B2%D1%8B%D1%81%D0%BE%D0%BA%D0%BE%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D1%85-%D1%81/ Разработка высокопроизводительных сервисов на Node.js] |
| | * [https://tproger.ru/articles/5-razlichnyh-instrumentov-dlya-obedineniya-prilozhenij-node-js 5 сборщиков модулей для приложений Node.js] |
| | * [https://yakovlev.me/web-razrabotka-eto-slozhno/ Сборка проекта в web-разработке] |
| | * [https://nodejsdev.ru/ Справочник Nodejs - RU ] |
| | * [https://sky.pro/wiki/javascript/vyzov-i-ispolnenie-binarnykh-komand-iz-node-js/ Вызов и исполнение бинарных команд из Node.js] |
| | * [https://drumcoder.co.uk/blog/2011/jan/10/nodejs-phone-book/ Node.js and Postgres Phone Book] |
| | * [https://github.com/pugjs/pug#readme Шаблорнизатор для NodeJS] |
| | * [https://www.pvsm.ru/web-razrabotka/2198/print/ Node.JS / Разработка WEB-проекта на Node.JS] |
|
| |
|
| * [http://nodeguide.ru/doc/ Руководства по Node.js от Felix’а]
| | ==ИСТОЧНИКИ== |
| | | * [https://metanit.com/web/nodejs/1.1.php Введение в Node JS] |
| * [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]]
| |
| | |
| ==Примеры кода==
| |
| ===Цепочка вызывающих себя через callback'и функций с передачей данных следующей функции (обработка ошибок в одном месте, массив функций в качестве параметра)===
| |
| | |
| С использованием 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]
| |
| <br>
| |
| * [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]
| |
| <br>
| |
| * [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>
| |
| * [[Node.js debian init.script]]
| |
| <hr>
| |
| '''''@модули для node.js'''''
| |
| * [http://thechangelog.com/stylus-expressive-robust-feature-rich-css-language/ stylus - работа со стилями через nod.js]
| |