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
相关产品推荐
相关产品推荐

