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

discord.js V13+Mongoose金币请求命令报错及数据传递问题

问题分析与解决

错误原因

你在ask.js中犯了两个核心错误:

  1. 直接给amount(即args[1],可能是字符串或undefined)调用setCustomId方法——这个方法是Discord组件(如MessageButton)专属的,普通字符串/数字/undefined没有该方法,这直接触发了Cannot read properties of undefined (reading 'setCustomId')错误。
  2. 校验逻辑顺序错误,在未判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:15:28