Discord.js编写抽奖功能触发DiscordAPIError: Invalid Form Body错误如何修复
核心问题说明
- 你触发标题超长的根本原因是代码写错了:
message.guild.members.cache.random是方法,必须加()才会返回随机用户实例,不加括号直接拼接会把函数本身的源码转成字符串,长度远超256字符,直接触发Discord接口限制 - 所有discord.js的消息发送、编辑操作都是异步返回Promise的,你没有加错误捕获逻辑,一旦调用失败就会抛出未处理的Promise拒绝警告
- Discord官方明确限制Embed的title字段最大长度为256字符,即使修了random调用问题,也需要对标题内容做截断避免极端情况触发限制
具体修复操作
- 修正随机用户调用逻辑,只取用户名字段拼接,避免不必要的长内容
- 对所有Embed的title、description字段做长度截断,超出限制的部分用
...省略 - 给所有异步操作加catch捕获异常,兜底处理报错
- 补充参数校验逻辑,避免用户不传奖品、时间参数的情况
修复后完整代码
client.on('message', message => { if (message.content.startsWith('!giveaway')) { const { MessageEmbed } = require('discord.js') const args = message.content.split(' ').slice(1) // 补充参数校验 if (args.length < 2) return message.channel.send('指令格式错误,请输入:!giveaway 抽奖时长(秒) 奖品名称').catch(e => console.log(e)) let time = args[0] if (isNaN(time)) return message.channel.send('抽奖时长必须是数字').catch(e => console.log(e)) let prize = args.slice(1).join(" ") // 对奖品做截断,description最大4096字符 if (prize.length > 4000) prize = prize.slice(0, 4000) + '...' const embed1 = new MessageEmbed() .setTitle('Giveaway started!') .setDescription(prize) .setFooter(`Giveaway will end in ${time} seconds.`) // 取随机用户的用户名,拼接后截断保证title不超256 const winner = message.guild.members.cache.random().user.username let endTitle = `Giveaway ended, winner: ${winner}` if (endTitle.length > 250) endTitle = endTitle.slice(0, 250) + '...' const embed2 = new MessageEmbed() .setTitle(endTitle) .setDescription(prize) .setFooter('Congrats!') // 加catch捕获异常 message.channel.send({ embeds: [embed1] }).then(msg => { setTimeout(() => { msg.edit({ embeds: [embed2] }).catch(e => console.log('编辑抽奖消息失败:', e)) }, time * 1000) }).catch(e => console.log('发送抽奖消息失败:', e)) } })
注:如果你使用的是discord.js v13及以上版本,发送Embed必须用{embeds: [embed实例]}的格式传参,不能直接传embed对象
内容的提问来源于stack exchange,提问作者itsmeares
相关产品推荐
相关产品推荐

