discord.js v14自定义循环状态报错,无法循环数组内状态
Discord.js v14 机器人状态循环切换修复方案
原代码核心问题
- 仅用
setTimeout只会执行一次状态切换,无法实现循环 - 计数器重置逻辑错误:数组索引从0开始,原判断
counter == activities.length+1永远不会触发,会导致索引越界报错 - 未声明
counter变量,会污染全局作用域 setActivity参数写法冗余,不符合Discord.js v14最佳实践- Mongoose连接同时用
await和.then(),写法不规范
修复后的完整代码
const mongoose = require("mongoose"); require("dotenv").config(); const { Client, ActivityType } = require("discord.js"); module.exports = { name: 'ready', /** * @param {Client} client */ async execute(client) { console.log(`✅ ${client.user.tag} is Ready!`); // 状态数组 const activities = [ { name: "Made By andrexdev", type: ActivityType.Playing }, { name: `${client.guilds.cache.size} Servers`, type: ActivityType.Watching }, { name: `${client.users.cache.size} People`, type: ActivityType.Watching } ]; let counter = 0; // 声明局部计数器变量 // 使用setInterval实现循环切换,每5秒执行一次 setInterval(() => { // 切换状态 client.user.setActivity(activities[counter]); // 更新计数器,自动循环重置 counter = (counter + 1) % activities.length; }, 5000); // 规范的Mongoose连接写法 try { await mongoose.connect(process.env.MONGOOSE_CONNECTION_STRING); console.log("✅ Connected to MongoDB!"); } catch (err) { console.error("❌ Failed to connect to MongoDB:", err); } } };
关键修改说明
- 替换
setTimeout为setInterval:setInterval会每隔指定时间重复执行回调,实现循环切换效果 - 修复计数器逻辑:用
(counter + 1) % activities.length自动处理循环,避免索引越界,比手动判断更简洁可靠 - 声明局部
counter变量:用let声明,避免全局作用域污染 - 简化
setActivity调用:Discord.js v14中setActivity可直接接收单个活动对象,无需包裹在activities数组中 - 规范Mongoose连接:改用
try/catch处理连接异常,错误处理更清晰,去掉冗余的.then()链式调用
额外优化提示
如果需要实时更新服务器/用户数量(比如机器人新增服务器后状态同步更新),可以将状态数组改为动态获取的函数:
// 动态生成状态数组,每次调用获取最新数据 const getActivities = (client) => [ { name: "Made By andrexdev", type: ActivityType.Playing }, { name: `${client.guilds.cache.size} Servers`, type: ActivityType.Watching }, { name: `${client.users.cache.size} People`, type: ActivityType.Watching } ]; // 在setInterval中调用 setInterval(() => { const currentActivities = getActivities(client); client.user.setActivity(currentActivities[counter]); counter = (counter + 1) % currentActivities.length; }, 5000);
内容的提问来源于stack exchange,提问作者Andris
相关产品推荐
相关产品推荐

