socket.io + backbone.js - 使用套接字实例作为模型成员的跨源请求错误

时间:2012-06-10 15:53:54

标签: backbone.js cross-domain socket.io broadcast

我正在使用服务器端的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”事件处理程序插入“alert”命令时不会显示。实际上,甚至没有任何内容写入套接字。但是,它仅在第二个客户端连接到同一服务器时才会调用相应的事件处理程序。

广播命令中是否有一些细微之处?当有一个客户时,没有广播吗?

2 个答案:

答案 0 :(得分:0)

好的,我已经解决了问题(1)。

基本上,模型实例化应该是:

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

D'哦!

问题2仍然存在。

答案 1 :(得分:0)

2)引自the official site

  

广播消息。

     

要进行广播,只需向broadcastemit添加send标记   方法调用。广播意味着向其他人发送消息   除了启动它的套接字。