discord.js V13+Mongoose金币请求命令报错及数据传递问题
问题分析与解决
错误原因
你在ask.js中犯了两个核心错误:
- 直接给
amount(即args[1],可能是字符串或undefined)调用setCustomId方法——这个方法是Discord组件(如MessageButton)专属的,普通字符串/数字/undefined没有该方法,这直接触发了Cannot read properties of undefined (reading 'setCustomId')错误。 - 校验逻辑顺序错误,在未判断
amount是否合法的情况下就执行了组件操作。
修复方案
1. 修正ask.js代码
调整校验顺序,将金额嵌入按钮的customId中,实现金额向interactionCreate.js的传递:
module.exports = { name: "ask", description: "ask for money", async execute(client, message, args, Discord, profileData) { let amount = args[1]; // 先完成金额合法性校验 if (!amount) return message.reply("Please enter a valid amount"); if (isNaN(amount)) return message.reply("Please enter a valid amount!"); amount = parseInt(amount); // 转换为数字类型,方便后续计算 if (amount < 1) return message.reply("You have to ask at least for one coin!"); if (amount > 5000) return message.reply("You can't ask for more that 5000!"); const embed = new Discord.MessageEmbed() .setColor("BLUE") .setTitle(`${message.author.username} is asking!`) .setDescription(`<:Hover_Bits:1019925128215277578>・${message.author.username} is asking for ${amount} coins!`); // 将金额嵌入按钮的customId,用于后续交互时获取 const row1 = new Discord.MessageActionRow() .addComponents( new Discord.MessageButton() .setCustomId(`pay-${amount}`) .setLabel('Pay') .setStyle('SECONDARY') ) await message.channel.send({ embeds: [embed], components: [row1], }) } }
2. 修正interactionCreate.js代码
通过拆分按钮的customId提取金额:
// 匹配带金额的支付按钮customId if (interaction.customId.startsWith('pay-')) { await interaction.deferUpdate(); // 拆分customId获取金额 const amount = parseInt(interaction.customId.split('-')[1]); // 此处可添加后续的转账逻辑,比如从支付者账户扣除amount,转给请求者 console.log(`需要支付的金币数额:${amount}`); }
关键说明
- 把金额嵌入按钮
customId是Discord.js v13中传递临时数据的简单可靠方式,无需额外存储。 - 先校验金额合法性再执行后续逻辑,能避免无效输入导致的各类错误。
内容的提问来源于stack exchange,提问作者DiscordJS
相关产品推荐
相关产品推荐

