discord.js执行embed命令报Cannot send an empty message错误如何解决
错误原因
- 该报错
DiscordAPIError: Cannot send an empty message是Discord开放接口返回的错误,discord.js仅做了错误透传,并非node_modules目录本身存在问题。从返回的请求参数可以看到,最终提交的embeds字段为undefined,接口判定本次消息无有效内容,因此返回报错。 - 触发该问题的常见原因有3个:
- 客户端实例名写错:代码中调用的是
clients.channels.cache.get(),如果初始化Discord客户端时使用的是常规命名client,多写的s会导致获取的频道对象无效,传参无法被正确解析 - Embed构造失败:
message.author.avatarURL()在用户无自定义头像时会返回null,空值会导致整个MessageEmbed实例构造异常,最终传入的embed对象被discord.js自动过滤 - 频道权限/ID错误:填写的频道ID不存在、机器人没有对应频道的发消息权限,也会导致参数解析异常,被接口判定为空消息
- 客户端实例名写错:代码中调用的是
修复方案
- 修正多余的await逻辑:
toLocaleString是Date对象的同步方法,不需要加await调用 - 给头像链接添加兜底值,避免空值导致Embed构造失败
- 增加频道存在性校验,确认获取到有效频道对象后再执行发送操作
- 确认客户端实例名和初始化时的命名一致
修复后的参考代码如下:
var CommandName1 = message.content var CommandName2 = CommandName1.replace(prefix, "") let time = new Date().toLocaleString('en-US'); var user = message.author.tag var UserProfile = message.author.avatarURL() ?? '无自定义头像' var UserID = message.author.id var MessageID = message.channel.id let report = new Discord.MessageEmbed() .setTitle("Report From Main Core File") .setColor("DARK_BUT_NOT_BLACK") .setDescription(`command: \`${CommandName2}\` \nexecution: \`successful\` \nreport path: \`Bot Core Assets/SCP bot assets/main.js\` \ntime: \`${time}\` \nuser: \`${user}\`\nuser profile: \`${UserProfile}\`\nuser ID: \`${UserID}\`\nmessage ID: \`${MessageID}\``) const notifyChannel = client.channels.cache.get("890166184979361792") if (notifyChannel) { notifyChannel.send({embeds: [report]}) } else { console.error("报告频道获取失败,请检查频道ID是否正确、机器人是否拥有该频道的访问及发消息权限") }
额外注意:如果你使用的是discord.js v14及以上版本,
MessageEmbed已被弃用,需要替换为EmbedBuilder,你需要先从discord.js中导入该类再进行实例化,其余配置逻辑不变。
内容的提问来源于stack exchange,提问作者some kid playing js
相关产品推荐
相关产品推荐

