You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:05:24