2

私は、Bukkit を使用する 2 つの Minecraft サーバーのプロジェクトに取り組んできました。サーバーの世界の動的マップと、サーバーでイベントが発生すると更新されるリアルタイムのイベント更新システムを含む Web ページを作成しようとして<div>います。私のシステムがどのように機能するかを簡単に説明すると、Minecraft サーバーは UDP パケットを介して同じネットワークを介して Node.js Web サーバーとイベントを通信し、Node.js Web サーバーはこれらのパケットを使用して、イベント情報を含む JavaScript オブジェクトを構築します。オブジェクトは保存され、ページが要求されるたびに Jade に渡されます。Jade がテンプレート作成を担当します。

私がやりたいことは、このページを動的に更新することです。これにより、ユーザーはイベントのリストを更新するためにページ全体を更新する必要がなくなります。私が実装しようとしているのは Facebook のティッカーのようなもので、Facebook の友人がステータスの投稿、投稿へのコメント、投稿への「いいね」などを行うたびに更新されます。

SO に関するこの質問を読んで、PHP スクリプトでロング ポーリングを使用する必要があると結論付けましたが、ほぼ完全に Node.js で記述された Web サーバーに PHP を統合する方法がわかりません。どうすればこれを行うことができますか?


編集:
クライアント側のコードで問題が発生しました。

これはスクリプト ブロックです。

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()とをスクリプトの先頭に配置すると、アラートとログが記録されますが、下部では実行されません (したがって、 、、または prependconsole.log()の作成に問題があると思います。newsItemjade.render()

さらにスニペットやファイルを提供する必要がある場合は、お知らせください。いじくり回し中なので自力で解決するかもしれませんが、更新しない限りまだ助けが必要です。:)

4

1 に答える 1

1

PHP をスキップして、socket.ioを見てみましょう。可能な場合は Websocket を使用しますが、必要に応じてロング ポーリングにフォールバックし、クライアント側のライブラリは非常に使いやすくなっています。

node.js サーバーが新しいオブジェクトの準備ができると、接続されているすべてのブラウザーにそれをプッシュします。ClientJadeを使用して、テンプレートを使用してオブジェクトをレンダリングし (メイン テンプレートの関連部分を独自のファイルに分割する必要がある場合があります)、生成された dom 要素をフィードに追加します。

まず、まだこのようになっていない場合は、jade テンプレートの関連部分を独自のファイルに分割する必要があります。それを objTemplate.jade と呼びます。次に、ClientJade を使用して、ブラウザーで実行できるコンパイル済みのテンプレートを作成しますclientjade objTemplate.jade > jadeTemplate.js。jadeTemplate.js を public 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 に答える