2

我一直在为几个使用 Bukkit 的 Minecraft 服务器开发一个项目。我正在尝试创建一个网页,其中包含服务器世界的动态地图,以及一个实时事件更新系统,其中 a<div>会随着服务器上发生的事件而更新。为了简要介绍我的系统是如何工作的,Minecraft 服务器通过 UDP 数据包通过同一网络与 Node.js 网络服务器通信事件,并且 Node.js 网络服务器使用这些数据包来构建包含事件信息的 JavaScript 对象。然后存储对象,并在页面被请求时传递给 Jade。Jade 负责制作模板。

我想要做的是动态更新这个页面,这样用户就不必刷新整个页面来更新事件列表。我正在尝试实现的是类似于 Facebook 代码的东西,它会在每次 Facebook 朋友发布状态、评论帖子或“喜欢”帖子等操作时更新。

在阅读关于 SO 的这个问题时,我得出结论,我需要在 PHP 脚本中使用长轮询,但我不确定如何将 PHP 与几乎完全用 Node.js 编写的网络服务器集成。我怎么能这样做呢?


编辑:
我在客户端代码中遇到了问题。

这是脚本块:

script(src='/scripts/jadeTemplate.js')
script(src='/socket.io/socket.io.js')
script(type='text/javascript')
  var socket = io.connect();
  socket.on('obj', function(obj) {
    var newsItem = document.createElement("item");
    jade.render(newsItem, 'objTemplate', { object: obj });
    $('#newsfeed').prepend(newsItem);
    console.log(obj);
    alert(obj);
  });

这是objTemplate.jade

p #{object}
// That's it.

alert()andconsole.log()放置在脚本的顶部时,它会发出警报并记录,但在底部,它们不会执行(因此,我认为创建newsItem、 thejade.render()或 prepend 都有问题。

如果我需要提供更多片段或文件,请告诉我。我还在修修补补,所以我可能会自己解决它,但除非我更新,否则我仍然需要帮助。:)

4

1 回答 1

1

我会跳过 PHP 并看一下socket.io。它尽可能使用 websockets,但在必要时会退回到长轮询,并且客户端库非常易于使用。

每当您的 node.js 服务器准备好一个新对象时,它都会将其推送到所有连接的浏览器。使用ClientJade使用您的模板渲染对象(您可能必须将主模板的相关部分分解到其自己的文件中),然后将生成的 dom 元素添加到您的提要中。

首先,如果还不是这种方式,您需要将翡翠模板的相关部分分解为自己的文件。称它为 objTemplate.jade。然后使用ClientJade创建一个可以在浏览器中运行的编译模板:clientjade objTemplate.jade > jadeTemplate.js. 将jadeTemplate.js 放在您的公共js 目录中。

在您的 node.js 应用程序中,您将拥有类似这样的内容(伪代码):

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

listenForUDPPackets(function(obj) {
    saveObjSomewhere(obj);
    io.sockets.emit('obj', obj);
});

然后在客户端,是这样的:

<script src="/js/jadeTemplate.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
    var socket = io.connect();
    socket.on('obj', function(obj) {
        var newsItem = document.createElement();
        jade.render(newsItem, 'objTemplate', obj);
        $('#newsFeed').prepend(newsItem);
    });
</script>
于 2013-03-09T22:58:11.630 回答