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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:06:03