Модули, о которых следует знать: dnode
Об авторе: Питер Круминс использует node.js больше двух лет, и построил на ней свой проект Browserling. Оригинальные статьи серии можно найти в его блоге.
В этой серии мы пройдемся по нескольким десяткам модулей для node.js, с примерами и объяснениями для чего какой модуль лучше применять.
Первый модуль в серии - dnode. Dnode это библиотека для удаленных вызовов в свободном стиле, она написана Джеймсом Хэллидэем (SubStack) - одним из основателей Browserling и Testling.
Вот что это такое. Это server.js:
var dnode = require('dnode'); var server = dnode({ mul : function (n, m, cb) { cb(n * m) } }); server.listen(5050);
А это client.js:
var dnode = require('dnode'); dnode.connect(5050, function (remote) { remote.mul(10, 20, function (n) { console.log('10 * 20 = ' + n); }); });
Теперь при запуске client.js Вы получите вывод:
$ node client.js 200
Видите что получилось? Клиент вызвал функцию mul на сервере и передал ей аргументы 10 и 20. Они были перемножены на стороне сервера и результат был отправлен обратно к клиенту через callback.
Важно пояснить, что код никуда не передавался, всё сделано исключительно вызовами. Вы можете увидеть пример реализации протокола dnode в репозитории dnode-protocol на Github.
Вот более сложный пример, где клиент вызывает сервер, который вызывает клиент, возвращающий промежуточный результат серверу, который потом передает клиенту окончательный результат.
server.js:
var dnode = require('dnode'); var server = dnode(function (client) { this.calculate = function (n, m, cb) { client.div(n*m, function (res) { cb(res+1) }); } }); server.listen(5050);
client.js:
var dnode = require('dnode'); var client = dnode({ div : function (n, cb) { cb(n/5); } }); client.connect(5050, function (remote) { remote.calculate(10, 20, function (n) { console.log('the result is ' + n); }); });
При запуске клиента Вы получите результат 41. Вот что при этом происходит. Сначала клиент подключается к серверу dnode по порту 5050. После подключения, dnode вызывает функцию calculate на стороне сервера и передаёт ей аргументы 10 и 20 и функцию-обработчик, выводящую результат. Теперь когда сервер получает аргументы 10 и 20, он перемножает их и вызывает функцию div на клиенте, которая делит результат на 5. Полученный результат возвращается на сервер, к нему добавляется единица и вызывается изначальный обработчик, выводящий окончательный результат.
В Browserling мы везде используем dnode. Каждый сервис это сервер dnode и все они связаны между собой. Например, сервис аутентификации это сервер dnode. Мы может остановить его для обновления, не останавливая при этом весь сайт. Очень здорово.
Установить dnode можно через npm:
npm install dnodeИ так как у dnode есть четко определённый протокол, его можно реализовать на любом языке! Вот, к примеру, реализации на Perl, Ruby, PHP и Java.