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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 12:54:09