Discord.js发送Embed提示description字段必填错误排查
问题根因
从错误栈可以定位到,抛出50035错误的是TextChannel.send方法(对应代码中target.send(...)行,向general频道发消息的逻辑),和前面interaction.reply的embed配置无关。
触发错误的核心原因有2个:
- 你将MessageEmbed类型的返回值错误传入了仅支持交互组件(按钮、选择菜单等)的
components字段,discord.js序列化参数时无法识别该非法值,自动生成了一个所有字段均为null的空embed对象,空embed缺少必填的description字段,触发Discord接口校验失败。 - 代码存在两处语法/传参隐患,会在其他分支触发同类错误:
interactionCreate事件回调未加async关键字,内部使用await会直接抛出语法错误- else分支中
setWaitTime()已经返回了带embeds字段的完整消息结构,你又额外套了一层embeds: [],会导致传入的embed结构非法
你感知到“未修改逻辑却突然报错”,通常是本地npm依赖自动升级了discord.js版本,新版本对消息传参的校验更严格,之前容错的非法传参现在会直接触发错误。
修复步骤
- 修正
target.send的传参,将embed放入对应字段,如果defaultMessage(serverState)返回的是MessageEmbed实例,修改为:
target.send({ embeds: [defaultMessage(serverState)] })
如果该方法同时返回交互组件,需要将组件单独放入components字段,禁止将非组件类型的值传入components数组。
- 修正else分支的reply传参,直接使用
setWaitTime()返回的消息结构即可,无需额外包裹:
} else { interaction.reply(waitTrue) }
- 给
interactionCreate回调添加async关键字,保证await语法正常运行:
client.on('interactionCreate', async (interaction) => { // 原有业务逻辑 })
- 补充前置校验:在所有调用send/reply发送embed的位置,提前打印embed实例的description属性,确认值不为null/undefined后再发起请求,避免上游变量异常生成空embed。
内容的提问来源于stack exchange,提问作者Arin Bryan
相关产品推荐
相关产品推荐

