如何在 Discord.js v14 中实现带成员提及的用户信息命令

4次阅读

如何在 Discord.js v14 中实现带成员提及的用户信息命令

本文详解如何使用 Discord.js v14 构建一个健壮的前缀式 ,user 命令,要求用户必须提及目标成员(否则提示错误),并正确解析被提及者信息用于构建用户资料卡片。

本文详解如何使用 discord.js v14 构建一个健壮的前缀式 `,user` 命令,要求用户必须提及目标成员(否则提示错误),并正确解析被提及者信息用于构建用户资料卡片。

在 Discord.js v14 中,实现一个需强制提及他人的用户信息命令(如 ,user @Member)时,常见误区是直接用 === 严格匹配完整消息内容(如 message.content === ‘,user’)。这种写法会导致命令完全失效——因为当用户输入 ,user @Member 时,message.content 实际为 “,user “,与字面量 ,user 不相等,条件恒为 false,自然无法触发响应。

✅ 正确做法是使用字符串前缀匹配:

const prefix = ',';  client.on('messageCreate', async (message) => {   // 忽略机器人自身和非文本频道消息   if (message.author.bot || !message.guild || !message.content.startsWith(prefix)) return;    const args = message.content.slice(prefix.length).trim().split(/ +/);   const command = args.shift()?.toLowerCase();    if (command !== 'user') return;    // 提取被提及的成员(支持用户提及或ID)   const targetUser = message.mentions.users.first()      || (args[0] && await client.users.fetch(args[0].replace(/[<@!>]/g, ''), { cache: true }).catch(() => NULL));    // 验证是否提供了有效目标用户   if (!targetUser) {     return message.reply('❌ 请至少提及一位成员(例如:`,user @Alice`)或提供有效用户ID。');   }    try {     // 获取该用户在当前服务器中的成员信息(含角色、加入时间等)     const member = await message.guild.members.fetch(targetUser.id).catch(() => null);      const userinfoEmbed = new EmbedBuilder()       .setTitle('? 用户信息')       .setThumbnail(targetUser.displayAvatarURL({ dynamic: true }))       .addFields(         { name: '? 显示名称', value: targetUser.displayName, inline: true },         { name: '? 用户ID', value: ``${targetUser.id}``, inline: true },         { name: '? 账户邮箱', value: targetUser.email || '未公开', inline: true },         { name: '? 注册时间', value: `<t:${Math.floor(targetUser.createdTimestamp / 1000)}:F>`, inline: true },         { name: '? 服务器内昵称', value: member?.nickname || '无', inline: true },         { name: '? 服务器加入时间', value: member            ? `<t:${Math.floor(member.joinedTimestamp / 1000)}:F>`            : '❌ 该用户不在本服务器中', inline: true }       )       .setColor('#2e2f36')       .setFooter({ text: `请求者:${message.author.tag}`, iconURL: message.author.displayAvatarURL({ dynamic: true }) });      await message.channel.send({ embeds: [userinfoEmbed] });   } catch (error) {     console.error('获取用户信息失败:', error);     await message.reply('⚠️ 获取用户数据时发生错误,请稍后重试。');   } });

? 关键要点说明:

  • ✅ 使用 message.content.startsWith(prefix + ‘user’) 替代严格相等判断,兼容带参数/提及的任意变体(如 ,user@Alice、,user @Bob);
  • ✅ 通过 .slice() 和 .split() 安全拆分参数,避免空格干扰;
  • ✅ 同时支持 @mention 和纯 userID 输入(自动清洗 格式),提升命令鲁棒性;
  • ✅ 使用 message.guild.members.fetch() 获取服务器内成员详情(如角色、加入时间),而 message.mentions.users.first() 仅返回用户基础信息;
  • ✅ 添加 .catch(() => null) 防止因权限不足或用户不存在导致 promise 拒绝崩溃;
  • ✅ 嵌入式响应包含时间戳格式化(<171...:f>

text=ZqhQzanResources