Удаленный вызов метода Node.js - PullRequest
2 голосов
/ 26 марта 2012

Я делаю свои первые шаги с Node.js и мне было интересно, есть ли какой-нибудь способ вызвать JS-метод определения на стороне сервера (используя Node.js), но на стороне клиента. например,

function read_file_server_side(id){
  // Do stuff on the server side.
}

и затем со стороны клиента мы должны иметь возможность вызывать метод. Конечно, я понимаю, что можно обернуть серверный метод, используя принципы REST; то есть представить его клиенту как веб-сервис и иметь клиентов, использующих HTTP-запросы. Но это удобно, если можно использовать функцию напрямую.

Ответы [ 3 ]

3 голосов
/ 26 марта 2012

Вместо socket.io я бы предпочел указать вам Now.js . Он делает именно то, что вы хотите: поделиться функциями на стороне сервера на стороне клиента.

3 голосов
/ 26 марта 2012

Что ж, в узле есть модули для всего. Для всего есть «начальный коммит» и, скорее всего, в github. В этом случае каждое приложение выполняет запрос к серверу со стороны клиента или, другими словами, выполняет вызов RPC. Основным методом транспорта в этом случае является ajax. И в некоторых современных браузерах у нас есть веб-сокеты. Для ajax это самый простой метод, который вы можете сделать, что хотите:

На стороне клиента:

var request.ajax('/ajax/setLolz', {data : 'nice', type : 'post'})

request.done(function(msg) {
  $("#lolz").html( msg );
});

на стороне сервера:

var url  = reruire('url')
var http = require('http');
var lolz = 'wow';
var methods = {
  '/ajax/setLolz' : function (action, body, res) {
    res.end(lolz);
    lolz = body;
    someOtherFunction();
  }
}

http.createServer(function (req, res) {
  var body = '';
  var action = url.parse(req.url);

  req.on('body', function(text) {
    body += text;
  }

  req.on('end', function() {
    methods[action.path](action, body, res);
  }

}).listen(1337, '127.0.0.1');

Это был простой Аякс. Вы можете сделать это немного лучше, используя connect :

var connect = require('connect');
var app = connect()
  .use(connect.bodyParser())
  .use(function(req, res){
    var action = url.parse(req.url);
    methods[action.path](action, body, res);
  })
 .listen(1337);

Или проще с express :

var app = require('express');
var app = express.createServer()
  .use(express.bodyParser());

app.get('/ajax/setLolz', function(req, res){
  res.end(lolz);
  lolz = req.body;
  someOtherFunction();
});

app.listen(1337);

И да, есть множество модулей , которые могут вам помочь.

Что касается веб-сокетов, самый быстрый из известных мне серверов веб-сокетов - ws . Хотя некоторые браузеры могут не поддерживать его.

На стороне клиента:

websocket = new WebSocket('ws://www.host.com/ws');
websocket.onopen = function(evt) {
  websocket.send(JSON.stringify({method : 'setLolz', msg : 'yes '};
};
websocket.onmessag = function(evt) {
  $("#lolz").html( evt.data );
}

На сервере:

var WebSocket = require('ws');
var ws = new WebSocket('ws://www.host.com/ws');
var methods = {
  'setLolz' : function (msg, ws) {
    ws.send(lolz);
    lolz = msg;
    someOtherFunction();
  }
}

ws.on('message', function(data, flags) {
  data = JSON.parse(data);
  methods[data.method](data.msg);
});

Тогда есть socket.io , который делает вещи намного проще. Это кросс-браузер и работает везде. Построен на ajax и websockets и некоторых других методах. Вы все исправляете к событиям. Вы даже можете использовать его рядом с http-сервером, прослушивающим тот же порт.

var io = require('socket.io').listen(1337);

io.sockets.on('connection', function (socket) {
  socket.on('setLolz', function(data) {
    socket.emit('lolz', lolz);
    lolz = data;
  });
  socket.on('setLolz', someOtherFunction);// Yes, you can listen to an event with two functions
});

Но все же это не так просто, поэтому теперь я представляю вам nowjs .

В браузере:

now.setLolz(function(data){
  $("#lolz").html( data );
});

На стороне сервера:

var nowjs = require("now");
var app = nowjs.initialize(httpServer);

app.now.setLolz = function(cb){
  cb(lolz);
  lolz = data;
  someOtherFunction();
}

Я не хочу углубляться, но я надеюсь, что вы поняли суть. Есть и другие модули (dnode, hook.io, flatiron, railwayjs, racer, locomotivejs, ...), которые могут вам помочь. И да, вы всегда можете сделать свой собственный.

Удачного кодирования ...: D

1 голос
/ 26 марта 2012

Посмотрите здесь: Socket.IO

Вы в основном можете вызвать метод на стороне сервера просто и быстро.

Сервер:

socket.on('doAwesomeStuff', function (data) {
   startDoingAwesomeStuff();
}

function startDoingAwesomeStuff() {
   // this would be the remotely invoked method.
   ...
}

Клиент:

socket.emit('doAwesomeStuff', { my: 'data' });
...