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

discord.js运行反应角色指令触发Cannot send empty message错误如何解决

问题原因
  • 核心原因是你使用的discord.js v13+版本调整了消息发送的参数格式,旧版本直接传Embed对象给channel.send()的写法已经废弃,新版本要求必须将Embed实例放入embeds数组中,通过配置对象传递。你直接传Embed对象时,discord.js将其识别为content字段的赋值,而content要求是字符串类型,最终解析为undefined,触发空消息错误。
  • 额外存在多个影响功能运行的问题:
    1. 拼写错误:代码中两次出现reaction.emooji,多写了一个字母o,正确属性名为reaction.emoji,会导致表情匹配完全失效
    2. 反应移除事件逻辑错误:messageReactionRemove事件中你仍然调用roles.add添加角色,正确逻辑应该是调用roles.remove移除对应角色
    3. 事件重复注册问题:每次执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:48:03