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

Discord.js手动验证Bot角色分配报错:Cannot read properties of undefined

Discord Bot手动验证命令报错:TypeError: Cannot read properties of undefined (reading 'roles')

我正在开发一款用于GitHub模板的简易Discord验证Bot,编写了manuallyverify命令的代码,但执行时触发错误:TypeError: Cannot read properties of undefined (reading 'roles')。代码如下:

const Discord = require("discord.js");
require('dotenv').config();

module.exports = {
  name: "manuallyverify",
  description: "Manually verifies an User.",

  limits: {
    owner: false,
    permission: ["MANAGE_ROLES"],
    cooldown: "10s",
  },

  options: [
    {
      name: "user",
      description: "The User that will be affected by this action.",
      type: 6,
      required: true,
    }
  ],

  run: (client, interaction) => {
    let member = interaction.options.getUser("user").toString()
    let role = interaction.guild.roles.cache.find(role => role.id == process.env.verified_role_id)
    let embed = new Discord.MessageEmbed()
      .setTitle(":white_check_mark: ・ Manually Verified the User.")
      .addFields(
        {
          name: "User affected",
          value: interaction.options.getUser("user").toString(),
          inline: true,
        },

        {
          name: "Role given",
          value: `${role}`,
          inline: true,
        }
      )
      .setColor("#95eda4");

    try {
      interaction.guild.member.roles.cache.add(role)
      interaction.reply({ embeds: [embed] });
    } catch (e) {
      interaction.reply({content:`I encountered an error: ${e}`, ephemeral: true});
    }

  },
};

错误原因

报错核心是未正确获取目标用户的GuildMember实例:

  • interaction.options.getUser("user")返回的是Discord全局User对象,不包含服务器角色相关信息,无法直接操作角色。
  • interaction.guild.member是无效属性,本身就是undefined,自然无法读取roles。

解决方案

修改代码中获取成员和添加角色的逻辑,确保操作对象正确:

const Discord = require("discord.js");
require('dotenv').config();

module.exports = {
  name: "manuallyverify",
  description: "Manually verifies an User.",

  limits: {
    owner: false,
    permission: ["MANAGE_ROLES"],
    cooldown: "10s",
  },

  options: [
    {
      name: "user",
      description: "The User that will be affected by this action.",
      type: 6,
      required: true,
    }
  ],

  run: async (client, interaction) => {
    // 改用getMember获取服务器成员对象
    const member = interaction.options.getMember("user");
    const role = interaction.guild.roles.cache.find(role => role.id === process.env.verified_role_id);

    // 提前检查角色是否存在
    if (!role) {
      return interaction.reply({ content: "验证角色未找到,请检查环境变量配置。", ephemeral: true });
    }

    const embed = new Discord.MessageEmbed()
      .setTitle(":white_check_mark: ・ Manually Verified the User.")
      .addFields(
        {
          name: "User affected",
          value: member.toString(),
          inline: true,
        },
        {
          name: "Role given",
          value: `${role}`,
          inline: true,
        }
      )
      .setColor("#95eda4");

    try {
      // 调用GuildMember的官方add方法添加角色
      await member.roles.add(role);
      interaction.reply({ embeds: [embed] });
    } catch (e) {
      interaction.reply({ content: `I encountered an error: ${e}`, ephemeral: true });
    }
  },
};

关键修改点

  • 用interaction.options.getMember("user")替代getUser,直接获取带服务器权限信息的GuildMember对象。
  • 角色添加改为member.roles.add(role),这是Discord.js官方推荐的异步操作方式,原代码中操作缓存集合的写法无效。
  • 添加角色存在性检查,提前拦截配置错误导致的异常。
  • 将run函数改为异步函数,用await确保角色添加完成后再回复交互。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:18:29