【问题标题】:How can I call a javascript function on client browser from NodeJS server side?如何从 NodeJS 服务器端调用客户端浏览器上的 javascript 函数?
【发布时间】:2013-06-28 19:07:48
【问题描述】:

我在 NodeJS 服务器端编程,我希望在客户端浏览器端调用一个 javascript 函数。希望我可以不时地从服务器端调用客户端浏览器端的函数,就好像我只是在服务器端调用函数一样。

是否有某种形式或彗星或 RPC 可以做到这一点?

【问题讨论】:

  • 您正在寻找 Socket.io。

标签: node.js connect comet


【解决方案1】:

Socket.IO 将允许您在 node.js 和前端 JS 之间建立持久通信。

您可以从双方发出消息并订阅任何其他消息。由于它是双向通信,所以不需要任何请求/响应的东西,只需从任意一侧发出,它会被另一侧的回调缓存。

【讨论】:

    【解决方案2】:

    您必须使用 Socket.IO 来形成 web-socket 连接,该连接允许在建立一个初始连接后从任何一侧向另一侧发送数据。如果用户的浏览器中不允许使用 web-socket,Socket.IO 有许多备用方法。

    因此,您可以在客户端代码中添加一个事件绑定器,该事件绑定器将响应从 nodejs 服务器端发送的任何数据,因此您可以从服务器本身执行客户端功能。

    但是,如果您正在寻找在客户端定义函数并且可以直接从 nodejs 调用它的东西,那么您就错了。虽然它们都是 javascript,但它们在执行方面完全不同。 NodeJs 是服务器端的 javascript,不能同时用于两者。 但仍然如我上面所说,您可以使用 Socket.IO 和事件绑定器执行客户端函数。

    【讨论】:

      【解决方案3】:

      我检查了 Socket.IO,但最终改用 Faye。 Faye 的功能可能比您想要的多一点,但它的设置和使用非常容易。我发现它比 Socket.IO 更直观。并不是说 Socket.IO 看起来很难,而是 Faye 看起来更简单。

      这是网站:

      http://faye.jcoglan.com/

      还有一个谷歌用户组,作者已经回复了我的几个问题。

      您需要的是以下代码:

      节点端:

      var faye = require('faye');
      var faye_server = new faye.NodeAdapter({mount: '/faye', timeout: 120});
      
      console.log('Firing up faye server. . . ');
      faye_server.listen(8089);
      
      //send message out every 1 second
      setInterval( function()
      {   
          var currentTime_secsSinceEpoch = new Date().getTime() / 1000;
      
          faye_server.getClient().publish('/heartbeat', 
          {
              pageName: 'app.js',
              timeMessageSent_secs_since_epoch: currentTime_secsSinceEpoch,
              iFrame1CycleCount: iFrame1CycleCount
      
          });
      }, 1000);
      

      浏览器端:

      <script type='text/javascript'>
      //create faye client
      var faye_client = new Faye.Client('http://127.0.0.1:8089/faye');
      
      var faye_message_subscription = faye_client.subscribe('/heartbeat', function(message)
      {   
          //record the time message was received
          var receiveTime_secSinceEpoch = new Date().getTime() / 1000;
      
          console.log("Got heartbeat at " + receiveTime_secsSinceEpoch + "with a delay of " +
              receiveTime_secsSinceEpoch - message.currentTime_secsSinceEpoch + " secs");
          //Do something else important here!!
      }
      </script>
      

      就是这样!现在每次您的服务器发送“心跳”消息时,您的网页都会调用我们指定的函数并向控制台发送一条消息。很简单。

      Faye 有很多其他你可能想要使用的很酷的功能,但我认为这主要是你想要的。

      你可以很容易地将 Faye 连接到 node 中的 express 服务器,这使得它可以很好地与 web 服务器一起工作。

      【讨论】:

      • 我可能会使用 Faye。
      【解决方案4】:

      使用 socket.io 从服务器(在本例中为“for_client”)发出一个事件,客户端侦听该事件并为客户端事件(在本例中为“for_server”)设置监听器。可以有任意数量的事件,它们可以有一个可用于调用方法的回调。

      var io = require('socket.io').listen(80);
      
      io.sockets.on('connection', function (socket) {
        socket.emit('for_client', { someData: 'if necessary' });
        socket.on('for_server', function(data) {
           doSomethingServerSide(data);
        });
      });
      
      function doSomethingServerSide(data){ console.log(data); }
      

      在客户端

      <script src="/socket.io/socket.io.js"></script>
      <script>
        var socket = io.connect('http://localhost');
        socket.on('for_client', function (data) {
          console.log(data);
          socket.emit('for_server', { data: 'data' });
        });
      </script>
      

      【讨论】:

        猜你喜欢
        • 2019-05-22
        • 2018-05-10
        • 2011-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-27
        • 2015-10-29
        • 1970-01-01
        相关资源
        最近更新 更多