我一直在为一些使用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()
放在脚本的顶部时,它会发出警报并记录日志,但是在底部,它们不会执行(因此,我认为这是一个问题创建newsItem
,jade.render()
或前置。
如果我需要提供更多片段或文件,请告诉我。我还在修补,所以我可以自己解决,但除非我更新,否则我仍然需要帮助。 :)
答案 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>