Node.js socket.io在重新连接后再创建一个连接

Node.js socket.io在重新连接后再创建一个连接,node.js,socket.io,Node.js,Socket.io,我正在使用socket.io和node.js尝试一个简单的聊天应用程序。每次我重新启动node.js服务器时,socket.io都会自动重新连接,并以某种方式创建到服务器的另一个连接,即客户端现在会两次收到相同的聊天消息。如何修复此问题?默认情况下,断开套接字。io会重新连接丢失的连接,从而重新运行connect事件。因此,每次它重新连接时,您都会添加一个用于接收消息的事件侦听器。因此,您会收到相当于服务器重新启动/连接丢失的多条消息 Incoming Chat: Connected dsda

我正在使用socket.io和node.js尝试一个简单的聊天应用程序。每次我重新启动node.js服务器时,socket.io都会自动重新连接,并以某种方式创建到服务器的另一个连接,即客户端现在会两次收到相同的聊天消息。如何修复此问题?

默认情况下,断开套接字。io会重新连接丢失的连接,从而重新运行
connect
事件。因此,每次它重新连接时,您都会添加一个用于接收消息的事件侦听器。因此,您会收到相当于服务器重新启动/连接丢失的多条消息

Incoming Chat: 
Connected
dsdadsada
Disconnected                         //recieved by 1st listener
Connected                            //added 2nd listener
adasd
Disconnected                         //recieved by 1st listener
Disconnected                         //recieved by 2nd listener
Connected                            //added 3rd listener
您应该使用
一次
而不是
上的
来收听第一次连接,后者仅第一次运行eventhandler。试一试

iosocket.once('connect', function () {
而不是

iosocket.on('connect', function () {

尝试用以下方式编写index.html

 iosocket.on('connect', function () {
      $('#incomingChatMessages').append($('<li>Connected</li>'));
 });

 iosocket.on('message', function(message) {
      $('#incomingChatMessages').append($('<li></li>').text(message));
 });

 iosocket.on('disconnect', function() {
      $('#incomingChatMessages').append('<li>Disconnected</li>');
 });
iosocket.on('connect',函数(){
$('incomingChatMessages')。追加($('li>已连接);
});
iosocket.on('message',函数(message){
$('incomingChatMessages')。追加($('li>')。文本(消息));
});
iosocket.on('disconnect',function()){
$(“#incomingChatMessages”).append(“
  • 已断开连接”
  • ”); });
    这可能是由于其他2个EventListener已注册到connect事件所致。
    当客户端断开连接时,其他两个侦听器仍将在此处,并且不会被注销。

    理想情况下,您不应该在连接上添加事件侦听器(或任何其他应用程序功能)。在服务器端,可以使用命名空间修复此问题。这允许您在服务器上对客户端的toe
    connect
    事件使用一次
    。遗憾的是,我们没有直接针对服务器的
    one
    io.one('connect',(socket:SocketIO.socket)=>{}
    在TS中给出了编译错误,而
    io.of('/xyz').one('connect',(socket:SocketIO.socket)=>{})
    效果很好。@Shamps您能解释一下为什么这不是一个好的做法吗?@igortp如果在应用程序初始化时使用“on”方法注册事件处理程序,您不需要在每个连接上都注册。当websocket重新连接并收到新消息时,将触发回调。如果在每个连接上添加事件处理程序,则还需要在断开连接时管理删除,这是不必要的。遗留的处理程序可能会导致内存泄漏。我认为您的解决方案更好。这里重要的一点是,在客户端脚本中,您指定了“连接”事件中的其他事件。(在CONNECT事件之外写入)