Discord.js机器人加入新服务器时重置致音乐播放中断问题
问题分析与解决
核心问题定位
你遇到的机器人重启问题,大概率不是来自当前提供的ready.js代码,而是处理服务器加入事件(guildCreate)的逻辑中存在触发重启的代码——比如意外调用了process.exit()、未捕获的异常导致进程崩溃,或是部署环境配置问题(部分平台检测到代码变更会自动重启)。
当前ready.js的逻辑仅在机器人启动完成后读取服务器列表并初始化servers变量,本身不会引发重启,但存在两处可优化的问题:
JSON.parse是同步方法,不需要加await- 循环赋值
servers[i]时未使用读取到的服务器名称,而是写死了固定值"asdas"
排查与修复步骤
1. 检查guildCreate事件处理代码
找到监听guildCreate事件的文件(比如guildCreate.js),重点排查:
- 是否存在
process.exit()、client.destroy()这类会终止/重启机器人的调用 - 是否有未捕获的异步错误(比如写入文件时未处理异常),导致进程崩溃重启
- 是否在添加新服务器时执行了触发重启的操作(比如强制重新加载配置)
2. 添加全局异常捕获防止崩溃
在机器人主文件(比如index.js)中加入全局异常捕获,避免未处理的错误导致进程重启:
process.on('uncaughtException', (err) => { console.error('未捕获的异常:', err); }); process.on('unhandledRejection', (reason, promise) => { console.error('未处理的Promise拒绝:', reason); });
3. 优化ready.js的服务器列表初始化逻辑
修正当前代码中的冗余和错误:
const fs = require("fs"); module.exports = (client, servers) => { client.once("ready", () => { console.log("Ready!"); try { const data = fs.readFileSync("./db/serverList.json", "utf-8"); const obj = JSON.parse(data); // 用读取到的实际服务器名称初始化 obj.servers.forEach((server, index) => { servers[index] = { name: server.name || '未知服务器', // 可添加音乐播放相关状态,用于持久化 queue: [], isPlaying: false }; }); } catch (error) { console.log("读取服务器列表文件失败: " + error); } }); };
4. 持久化服务器播放状态
为避免重启后丢失音乐播放进度,需要将每个服务器的音乐队列、播放状态等信息存储到文件或数据库(比如SQLite、MongoDB),而非仅保存在内存中。
需要补充的信息
若排查后仍未解决问题,请提供以下内容:
- 处理
guildCreate事件的完整代码 - 机器人主文件(如
index.js)的核心逻辑 - 部署环境的配置信息(是否使用PM2、Docker等进程管理工具)
内容的提问来源于stack exchange,提问作者gobs
相关产品推荐
相关产品推荐

