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

如何实现Discord机器人向提及角色的成员发送私信?当前代码报错TypeError: Cannot read property 'id' of undefined

解决Discord机器人向指定角色成员发私信的报错问题

报错原因分析

你遇到的TypeError: Cannot read property 'id' of undefined,核心问题是message.mentions.roles.first()返回了undefined——简单说就是机器人没识别到你命令里提及的角色。这大概率是两个原因之一:

  • 你输入命令时没有用@角色的格式正确提及角色,而是直接打了角色名/ID;
  • 代码里没做角色不存在的判断,直接就去访问role.id,自然触发报错。

另外还有个小问题:你原来的代码只取args[1]作为消息内容,这只能发送单个单词的消息,多字内容会被截断。

修复后的完整代码

if(message.content.startsWith(`${prefix}dm`)) { 
  const args = message.content.slice(prefix.length).trim().split(/ +/) 
  // 检查是否提供了角色参数
  if (!args[0]) return message.reply('你需要指定一个角色(可以用@提及、角色ID或角色名)') 
  // 检查是否提供了完整的消息内容(支持多字消息)
  const messageContent = args.slice(1).join(' ')
  if (!messageContent) return message.reply('你需要提供要发送的消息内容') 

  // 优先获取@提及的角色,没找到就尝试用ID/名称查找
  let role = message.mentions.roles.first();
  if (!role) {
    role = message.guild.roles.cache.find(r => r.id === args[0] || r.name.toLowerCase() === args[0].toLowerCase());
  }

  // 如果还是没找到角色,直接提示用户
  if (!role) {
    return message.reply('找不到这个角色哦,请检查输入是否正确!');
  }

  // 遍历角色成员发送私信,加入错误处理避免崩溃
  role.members.forEach(async (member) => {
    try {
      await member.send(messageContent);
      console.log(`成功给${member.user.tag}发送私信`);
    } catch (error) {
      console.error(`给${member.user.tag}发送私信失败:`, error);
      // 可选:如果需要告诉命令发起者哪些用户没收到,可以打开下面的注释
      // message.channel.send(`无法给${member.user.tag}发送私信,对方可能关闭了私信权限`);
    }
  });

  message.reply(`正在尝试给${role.name}角色的所有成员发送私信!`);
}

关键修改点说明

  • 完善角色获取逻辑:不仅支持@提及角色,还能通过角色ID或名称查找,让命令更易用;
  • 增加角色存在性检查:先判断role是否存在,再进行后续操作,彻底解决undefined报错;
  • 支持多字消息:用args.slice(1).join(' ')拼接所有消息参数,不再限制只能发单字;
  • 错误处理机制:加入try-catch捕获发送失败的情况(比如用户关闭了私信),防止机器人崩溃;
  • 更清晰的提示信息:告诉用户正确的命令使用方式,降低出错概率。

内容的提问来源于stack exchange,提问作者EZ Bot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:27:44