为什么客户端在服务器接收到发射后断开连接并重新连接?

时间:2014-07-28 18:09:20

标签: javascript express socket.io mongoose

在我的socket.io应用程序(版本1.0.6)中,我有许多事件遵循相同的架构:

客户端使用数据发出'some client emit',服务器接收'some client emit',在mongoose中保存一些对象,并将解析后的数据发送'some server emit'给其他客户端,并单独'some server emit'将特定数据发送给发送客户端。

例如,如果客户端代码包含:

...
console.log('emitting some client emit');
this.socket.emit('some client emit', {prop1: 'val1', prop2: 'val2'});
...
this.socket.on('some server emit', function(data){
   console.log('some server emit', data);
   if(data.doSomething){
      ...
   }
   ...
}

this.socket.on('error', function(err){
   console.log('error', err);
}
...

然后服务器代码包括:

...
io.on('connection', function(socket){
   console.log(socket.id, 'connected');
   ... deal with connect 

   socket.on('disconnect', function(){
      console.log('socket', socket.id, 'disconnected');
      ... deal with disconnect
   }

   socket.on('some client emit', function(data){
      console.log('some client emit', data);
      var newThing = new Thing({
         prop1: data.prop1,
         prop2: data.prop2
      });

      newThing.save(function(err){ // a mongoose object
         if(err){
            console.log('error saving thing', err);
            socket.emit('error', err);
         } else {
            console.log('saving successful');
            socket.emit('some server emit', {thing: newThing, doSomething: true});
            for (var i = 0; i < someListOfSocketIds.length; i++)
                socket.broadcast.to(someListOfSocketIds[i]).emit('some server emit', {thing: newThing, doSomething: false});
         }
      }
      console.log('end of some client emit');
   }
}

我遇到的问题是客户端发出'some client emit',服务器获取事件并将'some server emit'发送到套接字ID列表和发送客户端。所有客户端都会收到发射但是原始发送客户端收到保存错误并断开连接并重新连接。

所以发送客户端的控制台是这样的:

 - emitting some client emit
 - some server emit {prop1: 'val1', prop2: 'val2', _id: <some guid>}
 - error {type: "TransportError", description: TypeError, stack: "Error: parser decode error
    at WS.Transport.onError (http://cdn.socket.io/socket.io-1.0.6.js:1:28005)
    at WS.Transport.onData (http://cdn.socket.io/socket.io-1.0.6.js:1:28768)",
    message: "parser decode error", ...}

服务器的控制台是:

 - *client-socket-id* connected
 - some client emit  {prop1: 'val1', prop2: 'val2'}
 - saving successful
 - end of some client emit
 - socket *client-socket-id* disconnected
 - *client-socket-id* connected

应该注意的是, newThing 实际上确实进入了数据库,其他客户端确实获得了它们的发射,并且服务器代码"console.log('error saving thing', err);"在任何时候都没有运行。这对我来说真的很困惑。

1 个答案:

答案 0 :(得分:0)

所以问题是如果存在运行时错误,比如将变量与列表进行比较而不是列表的长度,例如,

for (var i = 0; i < list; i++){ ...
}

或访问null变量的属性:

var thing;
if (thing.someNullPropery == ''){ ...
}

, 在客户的接收代码中:

 this.socket.on('some server emit', function(data){ ...
 }

然后套接字立即断开连接,因为客户端仍在页面上,然后它连接导致断开/重新连接行为。我解决了我的问题,但如果有其他人有这个问题,console.log到处都是!