Discord.js获取提及成员ID实现!info命令无响应排查
故障原因
代码无响应是逻辑判断写法错误导致的,核心问题有4个:
- 未做消息前置校验就直接读取
msg.mentions.users.first().username,消息不带@时这行直接触发异常,且没有异常捕获逻辑,代码直接静默中断。 - Discord消息内的@用户存储格式不是纯文本
@用户名,是带特殊标识的提及结构,用===做字符串全等匹配永远无法命中判断条件,命令逻辑块根本不会执行。 - 缩略图地址取错,现有代码取的是发命令用户的头像,不是被@查询用户的头像。
- 未过滤机器人自身发出的消息,存在触发消息循环的风险。
修复代码
原有Mongoose Schema无需修改,消息监听逻辑替换为以下内容即可:
// 按需调整引入路径 const { MessageEmbed } = require('discord.js'); const User = require('./你的User模型存储路径'); // discord.js v13及以上版本用messageCreate事件,v12及更早版本替换为message client.on("messageCreate", async msg => { // 跳过所有机器人发送的消息 if (msg.author.bot) return; // 校验命令前缀,不符合直接返回 if (!msg.content.startsWith('!info ')) return; // 读取被@的目标用户 const targetUser = msg.mentions.users.first(); if (!targetUser) { return msg.reply("命令格式错误,请使用`!info @目标成员`格式发起查询"); } try { const userData = await User.findOne({ userID: targetUser.id }); if (!userData) { return msg.reply("该用户未完成信息注册,请先注册后再查询"); } const resultEmbed = new MessageEmbed() .setColor('#808080') .setTitle('成员存档信息') .setDescription(`**昵称:** ${userData.nickname}\n**冒险等级:** ${userData.ar}\n**所属服务器:** ${userData.server}\n**游戏UID:** ${userData.uid}`) .setThumbnail(targetUser.avatarURL({ dynamic: true })) msg.reply({ embeds: [resultEmbed] }); } catch (err) { console.error('信息查询失败:', err); msg.reply("查询过程出现内部错误,请稍后重试"); } });
注意事项
- 确认使用的discord.js版本匹配事件名:v13+必须用
messageCreate,旧版本用message,事件名写错会导致监听完全不触发。 - 确认用户注册入库时,
userID字段存储的是Discord用户的纯ID字符串,不要存带格式的提及串,否则无法匹配到数据。 - 所有数据库异步操作必须加异常捕获,否则连接异常、查询报错时都会出现无响应、无报错的静默失败问题。
内容的提问来源于stack exchange,提问作者Nevada
相关产品推荐
相关产品推荐

