Node.js远程调用方法

时间:2012-03-26 11:28:25

标签: web-services http node.js websocket rpc

我正在使用Node.js的第一步,我想知道是否有某种方法可以从客户端调用JS方法定义服务器端(使用Node.js)。 e.g。

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

然后,从客户端我们需要能够调用该方法。当然,我知道可以使用REST原则包装服务器端方法;即将其作为Web服务公开给客户端,并让客户端使用HTTP请求。但如果可以直接使用该功能,它会派上用场。

3 个答案:

答案 0 :(得分:3)

而不是socket.io,我宁愿指向Now.js。它完全符合您的要求:在客户端共享功能服务器端。

答案 1 :(得分:3)

关于节点的事情是有所有的模块。对于一切都有一个“初始提交”,很可能在github。对于这种情况,它是每个应用程序的一部分,从客户端向服务器发出请求,或者换句话说,进行RPC调用。这种情况下的基本传输方法是ajax。在一些现代浏览器中,我们有websockets。对于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');

这是简单的ajax。使用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);

是的,有很多modules可以帮助你。

截至websockets,我所知道的最快的websocket服务器是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

答案 2 :(得分:1)

看看这里:Socket.IO

您基本上可以轻松快速地在服务器端调用方法。

服务器:

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

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

客户端:

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