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

