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

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);
        }
    }
};

关键修改说明

  1. 替换setTimeout为setInterval:setInterval会每隔指定时间重复执行回调,实现循环切换效果
  2. 修复计数器逻辑:用(counter + 1) % activities.length自动处理循环,避免索引越界,比手动判断更简洁可靠
  3. 声明局部counter变量:用let声明,避免全局作用域污染
  4. 简化setActivity调用:Discord.js v14中setActivity可直接接收单个活动对象,无需包裹在activities数组中
  5. 规范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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:09:55