部署在Heroku的Discord.js音乐机器人播放数分钟后崩溃问题求助
错误根因
这个AudioPlayerError: aborted报错本质是音频播放过程中底层TLS连接被远端或网络环境主动重置,且该错误事件没有被捕获,导致Node.js进程直接崩溃:
- 触发连接重置的常见原因包括:音乐源(如YouTube)的反爬机制主动断开长连接、Heroku出站连接的最长存活时间限制被触发、连续播放过程中网络链路波动
- @discordjs/voice库的AudioPlayer默认不会自动处理流中断错误,必须手动监听error事件,否则只要出现一次流异常就会触发未捕获异常终止进程
修复方案
- 第一步:给AudioPlayer添加全局错误监听,捕获异常后自动切歌,避免进程崩溃
const { createAudioPlayer, AudioPlayerStatus } = require('@discordjs/voice'); const audioPlayer = createAudioPlayer(); // 监听播放错误 audioPlayer.on('error', (err) => { console.error('播放异常:', err.message); // 销毁出错的资源 err.resource?.destroy(); // 替换为你的队列切歌逻辑 if (global.playQueue.length > 0) { const next = global.playQueue.shift(); playAudio(next.url); } else { audioPlayer.stop(); } });
- 第二步:优化流处理逻辑,每首歌播放结束后主动销毁所有关联的流、ffmpeg进程、音频资源实例,避免残留连接占用网络资源
- 第三步:适配Heroku环境限制,每播放4-6首歌主动触发一次语音频道重连,重置网络链路,避免累计触发Heroku的长连接超时规则;如果使用的是免费dyno,建议升级为基础付费dyno,免费版的网络限制更严格,更容易触发连接重置
内容的提问来源于stack exchange,提问作者JoJo
相关产品推荐
相关产品推荐

