【问题标题】:Node.js method invocation remotely远程调用 Node.js 方法
【发布时间】:2012-04-09 21:44:50
【问题描述】:

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

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

然后,我们需要能够从客户端调用该方法。当然,我理解可以使用 REST 原理包装服务端方法;即,将其作为 Web 服务公开给客户端,并让客户端使用 HTTP 请求。但是,如果可以直接使用该功能,那就很方便了。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 非常感谢!看起来正是我需要的!
    • 耐心等待!无论如何,在您发布问题和您能够接受问题之间存在时间限制。但是,当然,这是给你的绿色勾号!
    • Now.js 建立在 Socket.io 之上,它需要它作为依赖项。看不出这有多好。
    • 因为这只是所需的抽象:不多也不少。
    • 是以另一个依赖为代价的抽象。
    【解决方案2】:

    关于节点的事情是,所有东西都有模块。‌ 对于所有东西,都有一个“初始提交”,而且很可能在 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

    【讨论】:

      【解决方案3】:

      看看这里:Socket.IO

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

      服务器:

      socket.on('doAwesomeStuff', function (data) {
         startDoingAwesomeStuff();
      }
      
      function startDoingAwesomeStuff() {
         // this would be the remotely invoked method.
         ...
      }
      

      客户:

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

      【讨论】:

      • 我没有看到如何从客户端调用位于服务器上的方法。可能吗?你能提供一个例子(甚至是伪代码)吗?
      猜你喜欢
      • 2023-04-11
      • 2012-03-31
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      相关资源
      最近更新 更多