サーバー側で node.js + express.js を使用し、クライアントに backbone.js を使用し、通信を処理するために socket.io を使用して、ライブ チャット ルーム ベースのアプリケーションを作成しています。
ここで直面している問題がいくつかあります。
1) クロスドメイン リクエストの問題:
var ChatRoom = Backbone.Model.extend( {
defaults : {
socket : "",
scoreBoard : {},
qMaster : "",
questionSrc : "",
},
initialize : function( scoreServer ) {
this.socket = io.connect( scoreServer );
var newScores = {};
this.socket.on('connect', function() {
console.log( "Connected!" );
});
this.socket.on('updateScores', function( scoreUpdates ) {
_.each( scoreUpdates, function( update ) {
newScores[ update['name'] ] = update['score'];
});
});
});
var chatRoom = new ChatRoom( "http://localhost:8080/" );
このようなオブジェクトを作成すると、 への呼び出しで接続を試みるとクロスオリジン エラーが発生しますio.connect
。Chrome での出力:
XMLHttpRequest cannot load http://[object%20object]:8080/socket.io/1/?t=1339342280788. Cross origin requests are only supported for HTTP.
socket.io 呼び出しでホストを正確に変更したのは何[object%20object]
ですか?
http://localhost:8080
ページを作成したサーバーです。ただし、ChatRoom のメンバーとしてソケットを削除し、次のようにハンドラー バインディングを行うと:
var ChatRoom = Backbone.Model.extend( {
defaults : {
scoreBoard : {},
qMaster : "",
questionSrc : "",
},
initialize : function( ) {
var newScores = {};
socket.on('connect', function() {
console.log( "Connected!" );
});
socket.on('updateScores', function( scoreUpdates ) {
_.each( scoreUpdates, function( update ) {
newScores[ update['name'] ] = update['score'];
});
});
});
var socket = io.connect( "http://localhost:8080" );
var chatRoom = new ChatRoom();
この場合、問題なく動作します。これはどのように可能ですか?
2) クライアントが socket.io サーバーに正常に接続されると、次のソケット ブロードキャスト コマンドが表示されます。
io.sockets.on( 'connection', function( socket ) {
console.log("Got here");
socket.broadcast.emit( 'updateScores', scoreUpdate );
(注: 'scoreUpdate' は別の場所で初期化されます)。ソケット サーバーのデバッグ メッセージは、ブロードキャストが実行されたことを示していますが、クライアントの「updateScores」イベント ハンドラーに「アラート」コマンドを挿入しても表示されません。実際、ソケットには何も書き込まれていません。ただし、適切なイベント ハンドラーが呼び出されるのは、2 番目のクライアントが同じサーバーに接続する場合のみです。
ブロードキャストコマンドに欠けている微妙な点はありますか? クライアントが 1 つの場合、ブロードキャストは行われませんか?