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

Discord.js HighLow命令报错:TypeError: b.setDisabled不是函数

解决Discord.js中TypeError: b.setDisabled is not a function的问题

错误原因

你代码里的buttons数组存储的是ActionRowBuilder对象,而非ButtonBuilder实例。setDisabled()是Discord.js按钮组件的专属方法,行组件(ActionRow)没有这个方法,调用时自然会抛出类型错误。

看这段错误根源代码:

const buttons = [row]; // row是ActionRowBuilder实例,不是按钮

修复步骤

  1. 单独存储按钮实例:先创建三个按钮实例并存入buttons数组,再用该数组构建ActionRow。
  2. 修正遍历对象:所有需要修改按钮状态(禁用、样式)的逻辑,遍历buttons数组(按钮实例)而非行组件。
  3. 修复end事件变量问题:collector.on("end")里的i未定义,改用sent.editReply或interaction.editReply编辑回复。

修改后的完整代码

const {
    ActionRowBuilder,
    ButtonBuilder,
    SlashCommandBuilder,
    ButtonStyle,
} = require("discord.js");

module.exports = {
    data: new SlashCommandBuilder()
        .setName("highlow")
        .setDescription("Starts a new high or low game!"),
    async execute(interaction) {
        const randomNumber = Math.floor(Math.random() * 100) + 1;
        const hintNumber = Math.floor(Math.random() * 100) + 1;
        
        // 先创建按钮实例并存储到buttons数组
        const buttons = [
            new ButtonBuilder()
                .setCustomId("high")
                .setLabel("High")
                .setStyle(ButtonStyle.Secondary),
            new ButtonBuilder()
                .setCustomId("low")
                .setLabel("Low")
                .setStyle(ButtonStyle.Secondary),
            new ButtonBuilder()
                .setCustomId("correct")
                .setLabel("Same")
                .setStyle(ButtonStyle.Secondary)
        ];
        
        // 用按钮数组构建ActionRow
        const row = new ActionRowBuilder().addComponents(buttons);
        
        const sent = await interaction.reply({
            content: `Is my number higher or lower than ${hintNumber}?`,
            components: [row],
        });
        
        const collector = sent.createMessageComponentCollector({
            filter: (i) =>
                i.user.id === interaction.user.id && i.message.id === sent.id,
            time: 30000,
            max: 1,
        });
        
        let won = false;
        
        collector.on("collect", async (i) => {
            await i.deferUpdate({ fetchReply: true });
            
            // 遍历按钮实例,禁用所有按钮
            buttons.forEach((b) => b.setDisabled(true));
            
            if (i.customId === "high") {
                if (hintNumber > randomNumber) {
                    buttons.find(b => b.data.custom_id === "high").setStyle(ButtonStyle.Danger);
                    await i.editReply({
                        content: `Sadge, you got it wrong! It was ${randomNumber}`,
                        components: [row],
                    });
                    won = false;
                } else {
                    buttons.find(b => b.data.custom_id === "high").setStyle(ButtonStyle.Success);
                    await i.editReply({
                        content: `You guessed the number! It was ${randomNumber}`,
                        components: [row],
                    });
                    won = true;
                }
            } else if (i.customId === "low") {
                if (hintNumber < randomNumber) {
                    buttons.find(b => b.data.custom_id === "low").setStyle(ButtonStyle.Danger);
                    await i.editReply({
                        content: `Sadge, you got it wrong! It was ${randomNumber}`,
                        components: [row],
                    });
                    won = false;
                } else {
                    buttons.find(b => b.data.custom_id === "low").setStyle(ButtonStyle.Success);
                    await i.editReply({
                        content: `You are right! It was ${randomNumber}`,
                        components: [row],
                    });
                    won = true;
                }
            } else if (i.customId === "correct" && hintNumber === randomNumber) {
                buttons.find(b => b.data.custom_id === "correct").setStyle(ButtonStyle.Success);
                await i.editReply({
                    content: `You guessed the number! It was ${randomNumber}`,
                    components: [row],
                });
                won = true;
            } else {
                await i.editReply({
                    content: `Sadge, you got it wrong! It was ${randomNumber}`,
                    components: [row],
                });
                won = false;
            }
        });
        
        collector.on("end", async (collected) => {
            if (!won && collected.size === 0) {
                buttons.forEach((b) => b.setDisabled(true));
                await sent.editReply({
                    content: `You didn't guess the number! It was ${randomNumber}`,
                    components: [row],
                });
            }
        });
    },
};

关键修改说明

  • 按钮实例单独存入数组,行组件通过按钮数组构建,修改按钮时行组件内的按钮引用会同步更新。
  • 用find()代替遍历判断customId,代码更简洁高效。
  • 修复了end事件中未定义的i变量问题。

内容的提问来源于stack exchange,提问作者Fawnino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:10:28