Discord editsnipe机器人未超长度却触发Invalid Form Body报错问题
问题修复方案
核心报错原因
你触发4000字符长度报错的根本原因是传参错误:
你创建MessageEmbed实例后没有赋值给变量,调用message.channel.send()时直接传入了MessageEmbed构造类本身,discord.js会尝试将这个类序列化为字符串作为普通消息内容发送,序列化后的类字符串长度远超4000字符限制,才会触发该报错,和你实际要发送的编辑快照内容长度没有关系。
其他存在的代码问题
除了核心报错外,你的代码还有多处可触发异常的逻辑漏洞:
- 第10行引用了未定义的
snipes变量,实际存储编辑快照的变量名为esnipes - 没有对embed字段内容做长度截断,Discord规定embed单字段内容上限为1024字符,若被编辑的原消息/新消息长度超过该限制会触发新的API报错
- discord.js v13及以上版本发送embed需要用
embeds字段包裹,直接传入embed对象会报错 - 所有异步发送消息的方法都没有加
await,会触发未处理的Promise rejection警告 - 导入模块时重复导入了Discord,存在冗余
- 校验目标快照不存在的逻辑分支没有加return,代码会继续往下执行读取undefined的属性触发报错
修复后完整代码
const { MessageEmbed } = require("discord.js") module.exports.run = async(client, message, args) => { const esnipes = client.esnipes.get(message.channel.id) if(!esnipes) return await message.reply({ content: '没有可抓取的编辑消息 :|'}) const esnipe = +args[0] - 1 || 0 const target = esnipes[esnipe] if (!target) { return await message.reply(`当前共有 ${esnipes.length} 条编辑消息可抓取。`) } const { newc, msg } = target // 对字段内容做截断处理,避免超出embed单字段长度限制 const oldContent = msg.content.length > 1024 ? msg.content.slice(0, 1021) + '...' : msg.content const newContent = newc.content.length > 1024 ? newc.content.slice(0, 1021) + '...' : newc.content const embed = new MessageEmbed() .setAuthor(msg.author.tag, msg.author.displayAvatarURL({dynamic: true})) .addField('原消息内容', oldContent) .addField('编辑后内容', newContent) await message.channel.send({ embeds: [embed] }) } exports.conf = { enabled: true, guildOnly: true, aliase:["es"] } exports.help = { name:"editsnipe", description:"抓取频道内最近编辑的消息", usage:"editsnipe [序号]", category:"通用" }
内容的提问来源于stack exchange,提问作者spongegar
相关产品推荐
相关产品推荐

