discord.js运行反应角色指令触发Cannot send empty message错误如何解决
问题原因
- 核心原因是你使用的discord.js v13+版本调整了消息发送的参数格式,旧版本直接传Embed对象给
channel.send()的写法已经废弃,新版本要求必须将Embed实例放入embeds数组中,通过配置对象传递。你直接传Embed对象时,discord.js将其识别为content字段的赋值,而content要求是字符串类型,最终解析为undefined,触发空消息错误。 - 额外存在多个影响功能运行的问题:
- 拼写错误:代码中两次出现
reaction.emooji,多写了一个字母o,正确属性名为reaction.emoji,会导致表情匹配完全失效 - 反应移除事件逻辑错误:
messageReactionRemove事件中你仍然调用roles.add添加角色,正确逻辑应该是调用roles.remove移除对应角色 - 事件重复注册问题:每次执行
reaction-roles指令都会重复注册messageReactionAdd和messageReactionRemove两个监听事件,运行时间久了会出现内存泄漏、角色重复添加/移除的异常。
- 拼写错误:代码中两次出现
修复方案
1. 修正Embed发送语法
将原来的发送代码:
let messagesEmbed = await message.channel.send(embed)
替换为符合v13+规范的写法:
let messagesEmbed = await message.channel.send({ embeds: [embed] })
2. 修正拼写与逻辑错误
- 将所有
reaction.emooji替换为reaction.emoji - 将
messageReactionRemove事件中的roles.add(verifyRole)修改为roles.remove(verifyRole)
3. 优化事件注册逻辑(强烈建议)
如果需要仅针对指令发送的这条消息生效,可以改用createReactionCollector实现,避免全局事件重复注册。
修复后完整代码
const { MessageEmbed } = require("discord.js"); module.exports = { name: 'reaction-roles', description: 'Das ist ein Verify Command', async execute(client, message, args, Discord) { if (!message.member.roles.cache.has('883408339525070919')) return message.channel.send('You dont have the role! Huanson'); const channel = '884122293343764491' const verifyRole = '884122984095285268' const verifySymbol = '✔️' let embed = new MessageEmbed() .setColor("GREEN") .setTitle('React to Verify') .setDescription('React with ✔️ to get Verified') // 修正Embed发送语法 let messagesEmbed = await message.channel.send({ embeds: [embed] }) messagesEmbed.react(verifySymbol) // 改用消息专属的反应收集器,避免全局事件重复注册 const collector = messagesEmbed.createReactionCollector({ filter: (reaction, user) => reaction.emoji.name === verifySymbol && !user.bot, dispose: true // 开启监听反应移除事件 }); collector.on('collect', async (reaction, user) => { await reaction.message.guild.members.cache.get(user.id).roles.add(verifyRole); }); collector.on('remove', async (reaction, user) => { await reaction.message.guild.members.cache.get(user.id).roles.remove(verifyRole); }); } }
内容的提问来源于stack exchange,提问作者Squepzz
相关产品推荐
相关产品推荐

