discord.js v13前缀匹配失效及Cannot send an empty message报错解决
问题排查与修复方案
核心报错原因
1. Cannot send an empty message错误
discord.js v13对channel.send()方法的传参格式做了不兼容更新:
- v12版本可以直接传入
MessageEmbed实例发送嵌入式消息 - v13版本必须将Embed内容放到
embeds数组参数中,否则会将传入的Embed对象识别为content字段值,类型不匹配导致content变为undefined,触发空消息报错
这也是为什么ping命令可以正常返回,所有前缀命令都报错的原因:ping命令返回纯文本符合v13传参要求,前缀命令都直接传Embed不符合要求。
2. message事件废弃警告
discord.js v13已将消息接收事件从message重命名为messageCreate,原事件仅做兼容保留,后续版本会直接移除。
具体修改步骤
步骤1:替换消息事件监听
将原事件监听代码:
client.on('message', message => {
替换为:
client.on('messageCreate', message => {
步骤2:修改所有嵌入式消息发送格式
将所有message.channel.send(Embed实例)的写法,统一改为带embeds参数的结构,示例如下:
原写法(v12可用,v13报错):
message.channel.send(new Discord.MessageEmbed() .setColor('#FAA81A') .setTitle("Truth") .setDescription(truth))
新写法(v13兼容):
message.channel.send({ embeds: [ new Discord.MessageEmbed() .setColor('#FAA81A') .setTitle("Truth") .setDescription(truth) ] })
所有前缀命令(t/d/tb/db/inviteme/vote/helpme)中的Embed发送逻辑都需要按上述格式修改。
步骤3:可选优化(避免异常报错)
为post命令增加频道存在校验,防止用户未指定频道时触发报错:
else if (command === "post") { const ch = message.mentions.channels.first(); if (!ch) return; // 未获取到提及频道时直接返回 ch.send(message.content.substring(prefix.length + command.length)) }
内容的提问来源于stack exchange,提问作者Irtiza Khan Labib
相关产品推荐
相关产品推荐

