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

Discord.js中hug命令如何正确获取被提及用户的用户名并避免机器人崩溃

解决Discord.js中Hug命令的用户提及处理问题

嘿,我懂你现在的困扰——手动用字符串替换来提取被@用户的ID实在太容易翻车了,不管是没提人还是提多了人都会导致机器人崩溃。其实Discord.js已经内置了专门处理用户提及的工具,完全不用自己折腾那些容易出错的字符串替换逻辑!

核心方法:利用message.mentions获取提及用户

Discord.js的Message对象自带一个mentions属性,其中message.mentions.users是一个Collection集合,会自动帮你收集消息里所有被@到的用户。用这个方法获取目标用户,既准确又能避开手动处理字符串的各种坑。

处理边界情况避免崩溃

我们需要提前拦截两种会导致崩溃的场景:

  • 用户只输入了`hug(没@任何人)
  • 用户@了多个用户

通过检查message.mentions.users.size(被提及用户的数量),就能轻松处理这些情况:

  • 数量为0时:提示用户需要@一个目标
  • 数量大于1时:提示用户一次只能拥抱一个人
  • 数量正好为1时:正常生成Embed发送

改进后的完整代码

client.on("message", message => {
  // 忽略机器人自身发送的消息
  if (message.author.bot) return;

  const prefix = "`";
  // 确认消息是hug命令
  if (!message.content.startsWith(prefix + "hug")) return;

  // 获取所有被@的用户集合
  const mentionedUsers = message.mentions.users;

  // 情况1:没有提及任何用户
  if (mentionedUsers.size === 0) {
    return message.reply("你需要@一个人来拥抱哦!");
  }

  // 情况2:提及了多个用户
  if (mentionedUsers.size > 1) {
    return message.reply("一次只能拥抱一个人哦!");
  }

  // 情况3:正好提及一个用户,取出目标用户对象
  const targetUser = mentionedUsers.first();
  const senderUser = message.author;

  // 创建拥抱Embed
  const hugEmbed = new Discord.MessageEmbed()
    .setTitle(`${senderUser.username} hugs ${targetUser.username}`)
    .setColor(0xbc13fe)
    .setImage("https://www.dropbox.com/s/450lk7apiuf0uk0/huggoooo.gif?dl=1");

  message.channel.send(hugEmbed);
});

为什么这个方法更可靠?

  • 完全抛弃了之前容易出错的字符串替换逻辑,直接用Discord.js原生API获取用户对象,不会出现ID提取错误的情况
  • 提前做了边界检查,再也不会因为没提人、提错人导致机器人崩溃
  • 代码结构更清晰,后续扩展功能(比如支持通过用户名查找用户)也更方便

内容的提问来源于stack exchange,提问作者Pratham Snehi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:02:33