Discord.js机器人开发:msg.mentions.users.first()失效、后续代码不执行
问题根本原因
- 当消息中没有任何用户被@时,
msg.mentions.users.first()会直接返回undefined,后续代码执行mentioner.id时就会抛出未捕获的TypeError,JavaScript运行时遇到未捕获的错误会直接中断当前执行栈的所有后续逻辑,这就是你看到“对应行之后代码完全不运行”的核心诱因。 - 代码本身还存在几处连带的逻辑错误,就算有@用户也可能触发报错:
- 变量名拼写不一致:从消息提及中拿到的变量叫
mentioner,但后续取值时拼写为mentiosner,在JS严格模式下会触发未定义变量的报错。 msg.guild.members.cache.get(mentioner.id)的返回值是服务器成员对象,如果成员不在本地缓存中会返回undefined,直接读取nickname属性会触发报错;且成员对象的nickname属性仅存储用户在服务器设置的自定义昵称,未设置时返回null,不符合取值预期。Math.random()方法不接受任何入参,仅会返回0~1区间的浮点数,传入的1, deaths.length两个参数完全不生效,原本的随机数计算逻辑无法正确生成数组有效索引。
- 变量名拼写不一致:从消息提及中拿到的变量叫
修复方案
- 给提及用户的判断加前置兜底:拿到
msg.mentions.users.first()的返回值后,先校验值是否存在,不存在就直接给用户发送操作提示,终止后续逻辑,避免空值访问报错。 - 给服务器成员的查询加缓存判断:从服务器成员缓存中取到对应成员对象后先判空,拿不到就给用户反馈,不要直接访问成员属性。
- 修正随机数生成逻辑,按照
Math.floor(Math.random() * 数组长度)的标准写法生成有效数组索引,不要给Math.random传无效参数。 - 统一变量命名,避免拼写错误导致的未定义引用问题。
修复后可运行的参考代码
const mentionedUser = msg.mentions.users.first(); // 无@用户时直接提示,避免空值访问 if (!mentionedUser) { return msg.reply('请@你要使用这个效果的目标用户'); } // 查询对应服务器成员 const mentionedMember = msg.guild.members.cache.get(mentionedUser.id); if (!mentionedMember) { return msg.reply('无法获取该用户在当前服务器的信息'); } // 正确生成随机索引 const randomIndex = Math.floor(Math.random() * deaths.length); // 构建嵌入消息 const deathEmbed = new Discord.MessageEmbed() .setTitle("**death'd**") .setDescription(`${mentionedMember.displayName} ${deaths[randomIndex]}`); // 发送消息 msg.channel.send(deathEmbed);
内容的提问来源于stack exchange,提问作者moiboi
相关产品推荐
相关产品推荐

