错误:在建立连接之前关闭了 WebSocket

Posted

技术标签:

【中文标题】错误:在建立连接之前关闭了 WebSocket【英文标题】:Error: WebSocket was closed before the connection was established 【发布时间】:2021-04-11 08:09:07 【问题描述】:

我有 Discord Music 机器人,它已经运行了将近一年。从昨天开始,我遇到了一个问题:

Unable to play a music: 
Error: WebSocket was closed before the connection was established

这是我的代码:

    try 
      var connection = await voiceChannel.join();
      if(guild.me.hasPermission("DEAFEN_MEMBERS")) guild.me.voice.setDeaf(true);
      queueContruct.connection = connection;
      play(message.guild, queueContruct.songs[0], message);
     catch (err) 
      queue.delete(message.guild.id);
      errorMessage(message, "1058");
      console.error("Unable to play a music: ");
      return console.error(err);
    

播放功能:

async function play(guild, song, message) 
  const serverQueue = queue.get(guild.id);

  if (!song) 
    if(serverQueue.voiceChannel)
      serverQueue.voiceChannel.leave();
    
    else 
      guild.voice.channel.leave();
    
    queue.delete(guild.id);
    return;
  

  try 
    let player = await ytdl(song.url, filter: 'audioonly', quality: 'highestaudio', highWaterMark: 1 << 25, opusEncoded: true, encoderArgs: ['-af', 'bass=g=0']);
    const dispatcher = serverQueue.connection.play(player,  type: 'opus', highWaterMark: 1, bitrate: 'auto', fec: true, volume: false )
      .on("finish", () => 
        serverQueue.songs.shift();
        play(guild, serverQueue.songs[0], message);
      )
      .on("error", error => 
        console.error(error);
      );

      dispatcher.setVolumeLogarithmic(serverQueue.volume / 5);
     catch(err)
      errorMessage(message, "1060");
    

我不知道是什么问题。有任何想法吗?这个错误到底是什么意思?

【问题讨论】:

【参考方案1】:

当您在未建立连接时在 websocket 上调用 close() 时会发生这种情况。您在问题中包含的代码不包含 close();检查 close(),并确保在未建立连接时不调用它。

discord.js 使用 ws,这是抛出错误的地方:

https://github.com/websockets/ws/blob/a2c0d447af711ca245cb534159fa7c4d9ae67e64/lib/websocket.js#L222

因此,如果 websocket 处于 CONNECTING 状态并且您调用 close() 则会引发错误。

参考资料: https://***.com/a/12503628/9483495

【讨论】:

感谢您的回答!但我很确定它根本没有调用任何 close() 函数。 Discord.js 可以在幕后调用它。我不确定它什么时候调用它。 我也收到了这个错误:Error [VOICE_CONNECTION_TIMEOUT]: Connection not established within 15 seconds. 我认为您的主要问题是连接问题,不知道为什么,可能是由于服务器不和谐。此呼叫在哪里打开连接? var connection = await voiceChannel.join(); 是的,我认为问题是连接问题。谢谢!

以上是关于错误:在建立连接之前关闭了 WebSocket的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 错误 - Web 套接字连接在建立连接之前关闭

failed: WebSocket 在连接建立之前关闭

Django Channels 错误:失败:在建立连接之前关闭 WebSocket

Flask-SocketIO - WebSocket 在连接建立之前关闭。 [Heroku]

“WebSocket 在连接建立之前关闭”

WebSocket 连接到 'ws:url' 失败:WebSocket 在连接建立之前关闭