Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在服务器接收到数据后客户端会断开连接并重新连接?_Javascript_Express_Socket.io_Mongoose - Fatal编程技术网

Javascript 为什么在服务器接收到数据后客户端会断开连接并重新连接?

Javascript 为什么在服务器接收到数据后客户端会断开连接并重新连接?,javascript,express,socket.io,mongoose,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.soc

在我的
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');
   }
}
然后,服务器代码包括:

...
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');
   }
}
服务器的控制台为:

 - *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实际上进入了数据库,其他客户端确实得到了它们的emit,服务器代码
“console.log('error saving thing',err);”
从未运行过。这让我很困惑。

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

for (var i = 0; i < list; i++){ ...
}
,, 在客户的接收代码中:

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

然后套接字立即断开连接,由于客户端仍在页面上,因此它会连接,从而导致断开/重新连接行为。我已修复了我的问题,但如果其他人有此问题,请在任何地方登录console.log

为了澄清并可能帮助其他可能像我一样存在此问题的人:如果出现运行时错误,客户端的套接字将自动断开连接。令人惊讶的是,很难找到任何记录这一点的东西。我意识到这一点非常模糊,但我似乎不能再缩小范围了。导致断开/重新连接行为的此类错误的一个示例是,仅尝试访问空字段或几乎任何仅在客户端上使用断点发现的基本运行时错误。我也搜索了各种文档,但什么也没找到。在我修复了几个bug之后,代码运行得很好,每次我看到相同的功能时,都是因为客户端上出现了类似的运行时错误。