加载包含动态内容的页面

时间:2013-03-09 22:44:44

标签: php node.js pug

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

我想要做的是动态更新此页面,以便用户不必刷新整个页面来更新事件列表。我想要实现的是类似Facebook的自动收报机,每当Facebook好友发布状态,评论帖子或“喜欢”帖子时,都会更新。

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


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

这是脚本块:

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()console.log()放在脚本的顶部时,它会发出警报并记录日志,但是在底部,它们不会执行(因此,我认为这是一个问题创建newsItemjade.render()或前置。

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

1 个答案:

答案 0 :(得分:1)

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

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

首先,如果不是这样,你需要将jade模板的相关部分分解为自己的文件。称之为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>