如何从NodeJS服务器端调用客户端浏览器上的javascript函数?

时间:2013-07-01 15:31:48

标签: node.js connect comet

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

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

4 个答案:

答案 0 :(得分:3)

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

这是网站:

http://faye.jcoglan.com/

还有一个Google用户群,作者已回复了我的几个问题。

您需要的是以下代码:

节点方:

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附加到节点中的快速服务器上,这使得它可以很好地与网络服务器配合使用。

答案 1 :(得分:2)

使用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>

答案 2 :(得分:0)

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

您可以发出消息并订阅来自双方的任何其他消息。由于它是双向通信,你不需要任何请求/响应的东西,只需从任何一方发出,它将通过另一方的回调进行缓存。

答案 3 :(得分:0)

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

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

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