0

サーバー側で 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 つの場合、ブロードキャストは行われませんか?

4

2 に答える 2

0

わかりました、質問 (1) を解決しました。

基本的に、モデルのインスタンス化は次のようにする必要があります。

var chatRoom = new ChatRoom( {"server" : "http://localhost:8080"} );

ああ!

ただし、問題 2 は引き続き発生します。

于 2012-06-10T18:15:42.243 に答える