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实例,不是按钮
修复步骤
- 单独存储按钮实例:先创建三个按钮实例并存入
buttons数组,再用该数组构建ActionRow。 - 修正遍历对象:所有需要修改按钮状态(禁用、样式)的逻辑,遍历
buttons数组(按钮实例)而非行组件。 - 修复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
相关产品推荐
相关产品推荐

