2013-03-09 334 views
2

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

我想要做的是动态更新此页面,以便用户不必刷新整个页面来更新事件列表。我试图实现的东西就像Facebook的代号,每当Facebook的朋友做一些事情,比如发布状态,评论帖子或者“喜欢”帖子时,都会更新。

在阅读this question on 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()console.log()放置在脚本的顶部,它警报和日志,但在底部,他们不执行(因此,我认为这是一个问题,无论是创建newsItemjade.render(),还是前置。

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

回答

1

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

只要您的node.js服务器有一个新对象准备就绪,它会将其推送到所有连接的浏览器。使用ClientJade来使用您的模板呈现对象(您可能必须将主模板的相关部分分解到它自己的文件中),然后将生成的dom元素添加到您的Feed中。首先,如果它不是这种方式,你需要将你的玉石模板的相关部分分解到它自己的文件中。称它为objTemplate.jade。然后使用ClientJade创建一个可以在浏览器中运行的已编译模板:clientjade objTemplate.jade > jadeTemplate.js。将jadeTemplate.js放入您的公共js目录中。

在您的节点中。JS应用,你就会有这样的事情(伪的codeY):

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> 
+0

我正要抱怨自己约不知道在哪里开始,但是我刷新了页面。 :)这很好,谢谢你的帮助。 – ChaoticWeg 2013-03-10 00:32:06

+0

我遇到了客户端代码中的一个问题,我相信用'jade.render()'。我编辑我的问题相应:) – ChaoticWeg 2013-03-10 05:05:40

+0

我会张贴作为一个新的问题。 – 2013-03-10 05:29:55