• Как реализовать Подгрузку контента в node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Берите SSE (Server-Sent Events) или WebSocketы в реализации socket.io или любой другой (это просто разные обертки, а в варианта вот два), если не считать устаревшего long pooling ака commet, но кому он нужен на ноде то. В примере чата Вы найдете все, что нужно socket.io/get-started/chat или поиском по NPM https://www.npmjs.org/browse/keyword/sse и так еще https://www.npmjs.org/browse/keyword/websocket найти там можно многое, но лучше https://www.npmjs.org/package/websocket и https://www.npmjs.org/package/sse там еще проще все. Если захочется все вместе на одном порту и websocket и SSE и REST API и RPC API и веб-страницы и статику, то смотрите мой https://github.com/tshemsedinov/impress и статьи по нему на хабре найти можно, слайды тут у меня на www.slideshare.net/tshemsedinov и примеры внутри идут.
    Ответ написан
    Комментировать
  • Javascript: библиотека отлова событий объектов ?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    А чем не подходит EventEmitter?

    var events = require('events');
    var test = new events.EventEmitter(); 
    test.on('событие', function() {});
    test.emit('событие');
    Ответ написан
  • Как при распараллеливании nodejs приложения по разным серверам иметь единый массив пользовательских сессий?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Самое лучшее, это держать сессии и общее состояние (например, модель игрового мира или машину состояний, используемую для управления объектом промышленной автоматизации и т.д.) в оперативной памяти. Сессии только в одном процессе, а общее состояние в каждом процессе. Чтобы клиент подключался всегда к тому процессу, в котором лежит его сессия, то соединение должно быть подписано специальной cookie с номером процесса, кука эта может устанавливаться при аутентификации и после этого, сетевой маршрутизатор или реверс-прокси будет передавать все запросы, помеченные этой кукой, именно в нужный процесс. Но процессы дохнут периодически, поэтому сессии нужно сохранять в БД, но лучше это делать в ленивом (lazy) режиме, т.е. не во время HTTP запроса от клиента, а поставить периодическое событие и сбрасывать из памяти в БД, и иметь механизм восстановления из БД. Если процесс пользователя погиб, то при первом следующем запросе состояние восстановится и дальше будет опять браться из памяти. Можно сделать упреждающее чтение, если процесс погибает, то в БД хранить для каждого процесса массив пользователей, чье состояние он обрабатывал и сразу после повторного запуска, процесс восстановит из БД все сессии и будет ждать "своих" пользователей. Что касается общего для многих пользователей состояния, то его можно синхронизировать между процессами при помощи нехитрого API, пересылающего лог изменений состояния из того процесса, в котором они произошли во все другие при помощи IPC, HTTP или ZeroMQ. Пример такого API вот тут: https://github.com/tshemsedinov/impress/blob/maste... Вкратце, оно имеет функции inc(path, value, delay); dec(path, value, delay); set(path, value, delay); get(path); delete(path, delay); и т.д. тут path - это путь к данным в объекте состояния, например inc('myCar.speed', 15, "2s") - увеличить скорость машины в модели на 15 с гарантированной синхронизацией между процессами в течении 2 секунд (это для того, чтобы сократить кол-во пересылок изменений, они склеятся в течении 2 секунд). Все inc/dec изменения аддитивны в любом порядке, поэтому их можно пересылать как угодно, а в другом процессе можно подписаться на изменение subscribe('myCar.speed', function(path, value, remote) { ... }); где path - 'myCar.speed', value - новое значение, remote - true если изменение из другого процесса. Думаю, что Вы найдете и более подходящие реализации, но пример должен быть понятен. Можно конечно держать и сессии и общее состояние в БД, например в MongoDB, но это приводит к тому, что во время HTTP запросов случается I/O, и запрос ждет, а согласитесь, что ни какого I/O это быстрее, чем асинхронное I/O, брать из памяти - всегда лучше, а синхронизировать в свободное время (пусть с ограниченной точностью, с отставанием), а если личные сессии, то ни какого отставания вообще нет.
    Ответ написан
    Комментировать
  • В чем проблема с Node.js ?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    После запуска node и получения приглашения можете писать JavaScript так: require('./helloworld'); А из командной строки запускается через node helloworld, писать с расширениями node.exe helloworld.js, как советуют выше, не обязательно. Командную строку запускать в винде нажатием Win+R и вводим cmd и жмем enter.
    Ответ написан
  • Как через Nginx проходят такие запросы?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Ничего странного нет, удаленный клиент подключился к твоему IP и прислал в сокет строку GET 37.28.156.211/sprawdza.php Тут он мог прислать любой URL. А отдала страницу нода, потому, что она, скорее всего, тоже не проверяет host в запросах. Лучше всего фильтровать по host в nginx. Проверь, чтобы нода делала server.listen(8080, '127.0.0.1'); а не просто server.listen(8080); Эксплуатировать такую проблему ни как нельзя, кроме как DOSить, это не сильно страшно, но фильтровать по хостам нужно.
    Ответ написан
  • Node.js + socket.io и mysql как организовать соединение?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Нужно открывать пул соединений через mysql.createPool используя библиотеку https://www.npmjs.org/package/mysql чтобы не случилось, что какое-то занято на долго запросом, а другое в ассинхронном режиме пришло и хочет быть обработано, пока предыдущее еще не вернулось. На событие разрыва соединения нужно навешивать его возобновление. Для случая с одним соединением так (для пула это нужно навесить на каждый конекшен:
    var mysql = require('mysql');
    connectMySql();
    
    function connectMySql() {
        var connection = mysql.createConnection(connectionString);
    
        connection.connect(function(err) {
            if (err) {
                setTimeout(function() {
                    connectMySql()
                }, 3000);
            }
        });
    
        connection.on('error', function(err) {
            if (err.code === 'PROTOCOL_CONNECTION_LOST') connectMySql();
        });
    }

    Если у вас небольшое приложение, то не стесняйтесь сделать конекшен или пул глобальным, чтобы он был сразу определен на обработчиках, а еще лучше сделайте для своего приложения неймспейс в глобальном контексте, например myApp = {} и в него запишите myApp.db = connection чтобы потом писать myApp.db.query(...); Посмотрите, какие красивые и лаконичные обработчики можно сделать, если не вестись на эти REST-суеверия и предубеждения против состояния на сервере и открытых долго конекшенов к БД и глобальных неймспейсов:
    // Обработчик для API по урлу http://127.0.0.1/example/app/examples/mysql/getCities.json
    module.exports = function(client, callback) {
      aliasNameMy.query('select * from City', function(err, rows, fields) {
        callback({ rows:rows, fields:fields });
      });
    }

    На гитхабе этот обработчик в контексте демо-приложения: https://github.com/tshemsedinov/impress/blob/maste...

    Ну и еще порекомендую свои утилиты для драйвера MySQL - https://www.npmjs.org/package/mysql-utilities
    и две статьи на Хабре, одну по этим утилитам - habrahabr.ru/post/198738 , а вторую по архитектуре в целом - habrahabr.ru/post/204958
    Ответ написан
    2 комментария
  • Универсальная обработка запросов в NodeJS. Какие варианты?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Универсального способа быть не может, потому, что все фреймворки имеют свою архитектуру и свою философию.
    Ответ написан
    Комментировать
  • Почему не устанавливается zmq для nodejs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Проверьте, есть ли Visual Studio чтобы компилировать С++
    Присылаю еще вывод в консоль при правильной сборке, может пригодиться:
    D:\ab>npm install zmq
    /
    > zmq@2.8.0 install D:\ab\node_modules\zmq
    > node-gyp rebuild
    
    D:\ab\node_modules\zmq>node "C:\Program Files\nodejs\node_modules\npm\bin\node-g
    yp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild
    Построение проектов в этом решении по одному. Чтобы включить параллельное построение, добавьте параметр "/m". binding.cc
    C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xlocale(323): warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    D:\ab\node_modules\zmq\node_modules\nan\nan.h(1221): warning C4267: 'argument': conversion from 'size_t' to 'int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    D:\ab\node_modules\zmq\node_modules\nan\nan.h(1247): warning C4267: 'argument': conversion from 'size_t' to 'int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(367): warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning) [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(564): warning C4344: behavior change: use of explicit template arguments results in call to 'v8::Local<T> NanNew<v8::String,char*>(P)' [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    with [ T=v8::String, P=char * ] but the regular function 'v8::Local<T> NanNew(const char *,int)' is a better match
    with [ T=v8::String ] if you expect 'v8::Local<T> NanNew(const char *,int)' to be called then you need to make it an explicit specialization
    with [ T=v8::String ]
    ..\binding.cc(590): warning C4244: 'argument' : conversion from 'int64_t' to 'const int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(591): warning C4244: 'argument' : conversion from 'int64_t' to 'int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(592): warning C4244: 'argument' : conversion from 'int64_t' to 'const int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(593): warning C4244: 'argument' : conversion from 'int64_t' to 'int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(594): warning C4244: 'argument' : conversion from 'int64_t' to 'const int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(595): warning C4244: 'argument' : conversion from 'int64_t' to 'int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(596): warning C4244: 'argument' : conversion from 'int64_t' to 'const int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(597): warning C4244: 'argument' : conversion from 'int64_t' to 'int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(598): warning C4244: 'argument' : conversion from 'int64_t' to 'const int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(599): warning C4244: 'argument' : conversion from 'int64_t' to 'int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(614): warning C4244: 'argument' : conversion from 'int64_t' to 'const int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(615): warning C4244: 'argument' : conversion from 'int64_t' to 'int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(616): warning C4244: 'argument' : conversion from 'int64_t' to 'const int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(617): warning C4244: 'argument' : conversion from 'int64_t' to 'int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(618): warning C4244: 'argument' : conversion from 'int64_t' to 'const int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(619): warning C4244: 'argument' : conversion from 'int64_t' to 'int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(620): warning C4244: 'argument' : conversion from 'int64_t' to 'const int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(621): warning C4244: 'argument' : conversion from 'int64_t' to 'int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(622): warning C4244: 'argument' : conversion from 'int64_t' to 'const int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(623): warning C4244: 'argument' : conversion from 'int64_t' to 'int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(957): warning C4244: '=' : conversion from 'int64_t' to 'int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(1049): warning C4244: '=' : conversion from 'int64_t' to 'int', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(1136): warning C4344: behavior change: use of explicit template arguments results in call to 'v8::Local<T> NanNew<v8::String,char*>(P)' [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    with [ T=v8::String, P=char * ] but the regular function 'v8::Local<T> NanNew(const char *,int)' is a better match
    with [ T=v8::String ] if you expect 'v8::Local<T> NanNew(const char *,int)' to be called then you need to make it an explicit specialization
    with [ T=v8::String ]
    D:\ab\node_modules\zmq\node_modules\nan\nan.h(1036): warning C4244: 'argument': conversion from 'int64_t' to 'int32_t', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(540) : see reference to function template instantiation 'v8::Local<T> NanNew<v8::Integer,__int64>(P)' being compiled
    with [ T=v8::Integer, P=int64_t ]
    ..\binding.cc(595) : see reference to function template instantiation 'v8::Handle<T> zmq::Socket::GetSockOpt<int64_t>(int)' being compiled
    with [ T=v8::Value ]
    D:\ab\node_modules\zmq\node_modules\nan\nan.h(1036): warning C4244: 'argument': conversion from 'uint64_t' to 'int32_t', possible loss of data [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    ..\binding.cc(540) : see reference to function template instantiation 'v8::Local<T> NanNew<v8::Integer,unsigned __int64>(P)' being compiled
    with [ T=v8::Integer, P=uint64_t ]
    ..\binding.cc(597) : see reference to function template instantiation 'v8::Handle<T> zmq::Socket::GetSockOpt<uint64_t>(int)' being compiled
    with [ T=v8::Value ]
    C:\Users\Timur\.node-gyp\0.10.32\deps\v8\include\v8.h(179): warning C4506: no definition for inline function 'v8::Persistent<T> v8::Persistent<T>::New(v8::Handle<T>)' [D:\ab\node_modules\zmq\build\zmq.vcxproj]
    with [ T=v8::Object ]
    Creating library D:\ab\node_modules\zmq\build\Release\zmq.lib and object D:\ab\node_modules\zmq\build\Release\zmq.exp Generating code Finished generating code zmq.vcxproj -> D:\ab\node_modules\zmq\build\Release\\zmq.node
    zmq@2.8.0 node_modules\zmq
    +-- bindings@1.1.1
    L-- nan@1.3.0
    Ответ написан
    Комментировать
  • Как правильно сделать Transform Stream?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Не оттуда наследуете, смотрите пример в исходниках ноды в /lib/crypto.js
    Например класс Hash так написан, он наследует LazyTransform, вот так: util.inherits(Hash, LazyTransform); потом LazyTransform наследует от stream.Transform вот так: util.inherits(LazyTransform, stream.Transform); и потом определен метод _transform
    Hash.prototype._transform = function(chunk, encoding, callback) {
      this._binding.update(chunk, encoding);
      callback();
    };
    Ответ написан
  • Чем учить node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Вообще, нужно просмотреть документацию по API, попробовать что-то написать на небольшой задаче, и слить исходники ноды, по исходникам часто можно понять то, что по докам не очевидно. Можно найти в гитхабе несколько проектов в открытом коде и посмотреть как устроен код. Проверить свои знания можно на примерах заданий в nodeschool.io очень советую. Ну а совсем для начинающих подойдут скринкасты - learn.javascript.ru/nodejs-screencast
    Ответ написан
    Комментировать
  • Какие инструменты есть для реализации модульного приложения в node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Сервер приложений https://www.npmjs.org/package/impress
    Можно подключить несколько приложений, открыть все на одном или нескольких портах, маршрутизирует между приложениями по доменному имени в урле запросов, и внутри каждого приложения вся логика разбита на отдельные обработчики, посмотри примеры. Но это не express совместимая штука.
    Ответ написан
    Комментировать
  • Как разделить работу сервера и клиента с точки зрения безопасности?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Считайте и на сервере и на клиенте, чтобы постоянно не гонять между ними результаты, но иногда сравнивайте. Если клиент не делает запросы на сравнение, но другие запросы делает, или его данные отличаются от серверных, то он читер - блокируйте. Нода не очень хороша в долгих расчетах, но если формула очень простая, и вам не нужно просчитывать миры с точностью до пылинки, то проблемы не будет. Для клиент-серверного взаимодействия используйте websocket (двусторонний обмен) и Server-sent Events (односторонняя трансляция серверных событий на клиента, но много проще в реализации и надежности). При обмене клиента и сервера добавьте немного криптографии, например, постоянно изменяющийся код, которым подписывается каждое сообщение при обмене между клиентом и сервером. Код может зависеть от порядкового номера сообщения (синхронные счетчики должны быть у клиента и сервера), от предыдущего сгенерированного случайного числа, присланного сервером, от шага в игре, и этот код можно примешивать к контрольной сумме сообщения, приходящего с клиента (это чтобы было сложно написать эмулятор, прикидывающийся клиентом).
    Ответ написан
    Комментировать
  • Как парсить картинки через GET запрос NodeJs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Или почитайте что такое замыкание или этот код не будет работать. Или нельзя объявлять функции внутри цикла или нельзя писать var внутри цикла. Или вы учите JavaScript тут: learn.javascript.ru или ноду тут: learn.javascript.ru/nodejs-screencast а потом лабораторки тут: nodeschool.io

    var request = require('request'),
        crypto = require('crypto');
    
    var token, url;
    for (var i = 0; i < 5; i++) {
    	token = crypto.randomBytes(16).toString('hex');
    	url = 'https://wu.wsiz.rzeszow.pl/wunet/photos/s' + token + '.jpg';
    	doRequest(url);
    }
    
    function doRequest(url) {
        request.get(
        	{ uri:url, method:'GET', encoding:'binary' },
        	function (err, res, body) {
                console.time(url);
                body = new Buffer(body, 'binary');
                console.timeEnd(url);
            }
        );
    }
    Ответ написан
    3 комментария
  • Как увеличить скорость mysql на node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Кроме проблем, уже разобранных выше, для ускорения пригодится посмотреть, что такое mysql.createPool, пригодится для асинхронного исполнения конкурирующих запросов, чтобы они шли не через одно соединение и не толпились. Так же гляньте на модуль cluster, для многопоточного запуска ноды, если у Вас запросы к БД происходят во время HTTP запросов, то их можно распараллелить на несколько ядер, а по умолчанию все обрабатывается на одном ядре. Будет не лишним подумать по поводу кеширования результатов запросов в оперативной памяти, или вообще перейти от исполнения запросов к БД из HTTP-запросов, к их предварительному и отложенному исполнению. То есть, при старте забирайте как можно больше данных сразу в память (сейчас памяти много и она дешевая), на HTTP запросах делайте поиск по хешу вместо запроса к БД, а при изменениях, не делайте запрос сразу, а пишите изменение в специальную очередь и сохраняйте в БД в ленивом (lazy) режиме. Так ускоритесь на несколько порядков. Если данные не помещаются в память, то не используйте предварительное чтение, а делайте только отложенную запись. И еще может пригодиться моя либа, ну это уже для удобств, а не для скорости: https://www.npmjs.org/package/mysql-utilities Вообще, советую PgSQL или MongoDb, гораздо шустрее они и удобнее, сам уже не юзаю MySQL и рад этому.
    Ответ написан
    1 комментарий
  • Как вы используете node.js в продакшене?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Использую ноду и только ноду уже 2 года для разработки реальных проектов и всю команду нашу тоже подсадил. Проблемы в ноде три: модульный плюрализм (который все хвалят, но это ад), обработка ошибок (не всегда в распечатке стека удается получить файл, строчку и сообщение), и отсутствие централизованной архитектуры приложений. Я сторонник монолитных централизованных систем и тоталитаризма вообще, поэтому мы сделали свой сервер приложений: https://www.npmjs.org/package/impress
    Ответ написан
    Комментировать
  • Как на localhost node-сервере вывести client ip?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Попробуйте кейс заголовка "X-Forwarded-For", но скорее всего прокси его просто не устанавливает, нужно отконфигурировать nginx или haproxy или что там используется.
    Ответ написан
  • Node.js не могу установить модули. Почему?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Все правильно выдает ошибку, вы пытаетесь установить cheerio как зависимость в саму себя. Не нужно сливать с git архив, просто в пустую папку ставьте через npm install cheerio. Git для этого вообще не нужен.
    Ответ написан
    Комментировать
  • Как организовать обмен сообщениями между различными физическими серверами?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    ØMQ aka ZeroMQ
    zeromq.org
    https://www.npmjs.org/package/zmq
    или другие *MQ протоколы/библиотеки, в общем, это направление имеет много альтернативных решений, но нам роднее и дороже ZMQ
    Ответ написан
    Комментировать
  • Сокеты в мобильном приложении?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Потенциальная возможность держать много открытых сокетов есть, например habrahabr.ru/post/123154 Но все зависит от того, как вы напишете свой сервер на node.js. Пару сотен тысяч пользователей потребуют несколько потоков ноды, а значит и межпроцессовое взаимодействие. Если они у вас еще и логику какую-то сложную будут исполнять, то может потребоваться несколько потоков на нескольких серверах. Смотрите на библиотеки: cluster, zmq или на готовые решения по развертыванию серверной инфраструктуры и объединению ее в один пучок impress.
    Ответ написан
    Комментировать
  • Как и где найти модули для Node.js для организации кошерного REST API?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    REST есть величайшее мракобесие и маразм всех времен и народов. Берите RPC, как советуют. На голом примитивном механизме HTTP с его недоразвитым набором глаголов POST, GET, PUT, DELETE, которые невозможно расширить и кастомизировать, сложно разработать что-то более сложное, чем работа с файлами или с записями базы данных по принципу CRUD (CREATE, READ, UPDATE, DELETE). Когда же нужно сделать хоть что-то большее, над ресурсом, ввести свой глагол, то вся идеология рушится. Например, у меня есть нефтепровод с магистральными насосными агрегатами, и нужно управлять закрытием и открытием задвижек, параметрами регуляторов давления, мониторингом катодной защиты, другими подсистемами. Эти команды через POST или PUT посылать? Смешно, да? Тут нужно 5000 глаголов/методов ввести над 20ю ресурсами, а не 4 несчастных глагола над несчетным кол-вом ресурсов. Или даже над данными в БД мне нужно новые глаголы, например, хочу создать связь между двумя объектами или дать права пользователю на изменение параметра объекта или запустить отложенную задачу генерации отчетов на сервере, просто запустить и получить в ответ прогнозируемое время завершения, как это сделать на REST? Я уже не говорю о том, что операции могут быть вообще не над ресурсами. Операции могут быть над множествами, запросами (фильтрами, выборками, курсорами), над машиной состояний, над связями между несколькими ресурсами, над системой в целом или вообще над потоками данных, событий или технологическим оборудованием.
    Ответ написан
    5 комментариев