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

Discord.js v13如何通过用户ID获取GuildMember对象实现userinfo命令

你原来的代码存在两个核心问题:

  1. 获取用户的逻辑写法错误,message.guild.member.length(args[0])是完全无效的语法,discord.js没有这个调用方式
  2. 硬编码使用了message.member(命令发起者的成员对象)来填充Embed字段,导致不管查询谁,最终展示的都是发起者的服务器角色数、加入时间等信息

以下是修改后的完整可运行代码,支持@提及、输入用户ID两种查询方式,未输入参数时默认查询发起者自己的信息:

const moment = require('moment');
const { MessageEmbed } = require('discord.js')
module.exports = {
  description: 'whois',
  run: async (client, message, args) => {
    try {
      // 1. 获取目标用户:优先@提及,其次用ID查询,无参数默认查自己
      let targetUser;
      if (message.mentions.users.size > 0) {
        targetUser = message.mentions.users.first();
      } else if (args[0]) {
        // 用输入的ID拉取用户,fetch是异步操作需要加await
        targetUser = await client.users.fetch(args[0]);
      } else {
        // 无参数时返回发起者自己的信息
        targetUser = message.author;
      }

      // 2. 拉取用户在本服务器的成员对象,用于获取服务器内的角色、加入时间等信息
      const targetMember = await message.guild.members.fetch(targetUser.id);

      // 3. 构造Embed,所有字段改用查询到的目标用户/成员属性
      const embed = new MessageEmbed()
        .setTitle(`**PASSION ISLAND MODERATIONS**`)
        .setColor('#ffc0cb')
        .setThumbnail(targetUser.displayAvatarURL({ dynamic: true }))
        .addField('Username', targetUser.username)
        .addField('User Id', targetUser.id)
        .addField('Account Type', `${targetUser.bot ? 'Bot' : 'Human'}`)
        .addField(`Roles`, `${targetMember.roles.cache.size}`)
        .addField(`Joined At`, `${moment.utc(targetMember.joinedAt).format('ddd, MMM Do, YYYY, h:mm a')}`)
        .addField(`Created At`, `${moment.utc(targetUser.createdAt).format('ddd, MMM Do, YYYY, h:mm a')}`)
        .setTimestamp()
        .setFooter(`Requested by ${message.author.username}`)
      message.channel.send({ embeds: [embed] })
    } catch (err) {
      // 异常处理:ID无效、找不到用户时返回提示
      message.channel.send("未找到对应用户,请检查输入的ID是否正确,或确认用户在本服务器内")
    }
  },
}

注意事项:

  • 如果你使用的是discord.js v13及以上版本,需要在bot初始化代码中开启GUILD_MEMBERS特权网关意图,否则无法正常拉取服务器成员信息
  • 如果不需要无参数默认查自己的逻辑,可以删除对应的else分支,换成参数为空时的提示即可

内容的提问来源于stack exchange,提问作者Jacy Harrington

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:39:03