我正在使用服务器端的 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”事件处理程序插入“警报”命令。事实上,甚至没有任何东西写入套接字。但是,只有当第二个客户端连接到同一服务器时,才会调用相应的事件处理程序。
广播命令中是否缺少一些微妙之处?当只有一个客户端时没有广播吗?