Discord.js踢人命令报错TypeError:无法读取undefined的'roles'属性求助
Discord.js 踢人命令报错解决方案
你的报错TypeError: Cannot read property 'roles' of undefined是代码逻辑错误导致的,具体问题点如下:
- 变量重定义覆盖:你已经通过
const target = message.mentions.members.first()拿到了被@的成员对象,后续又用let [target, ...reasonKick] = args把target覆盖为了参数数组的第一个字符串值,后续调用target.id自然返回undefined - 无用代码+参数逻辑错误:
[...reasonKick].join(' ')没有赋值给变量,执行后没有任何效果;message.guild.members.cache.find(target => target.id)是完全无用的代码,返回的结果没有被接收,且回调逻辑错误 - 类型匹配错误:你直接拿用户ID字符串和
memberTarget(GuildMember对象)做全等判断,永远返回false;后续message.guild.members.cache.get(memberTarget)时传入的是GuildMember对象而不是用户ID,自然返回undefined,调用.roles就触发了你的报错 - 多余的取值逻辑:你已经拿到了
target也就是被@的成员对象,完全不需要再去members.cache里重复查找memberTarget
修正后可运行代码
// 如果是Discord.js v12及以下版本不需要引入Permissions,直接用原hasPermission方法即可 const { Permissions } = require("discord.js"); module.exports = { name: 'kick', description: 'This command kicks a member', execute(message, args){ // 先判断机器人自身权限 if (!message.guild.me.permissions.has(Permissions.FLAGS.KICK_MEMBERS)) { return message.reply('我没有踢人权限,无法执行该操作'); } // 判断操作者权限 if (!message.member.permissions.has(Permissions.FLAGS.KICK_MEMBERS)) { return message.reply("你没有执行该命令的权限"); } // 取被@的目标成员 const target = message.mentions.members.first(); if(!target){ return message.reply('你需要@要踢出的成员,指令格式:`!o kick @user 踢人原因`'); } // 截取踢人原因,跳过第一个参数(第一个参数是@用户的匹配内容) const reasonKick = args.slice(1).join(' ') || '未填写原因'; // 禁止踢自己 if (message.author.id === target.id) { return message.reply('你不能踢你自己'); } // 禁止踢机器人自身 if (message.client.user.id === target.id) { return message.channel.send('别试了,你踢不掉我'); } // 权限等级判断 if (message.member.roles.highest.position <= target.roles.highest.position) { return message.reply(`你权限等级低于${target.user.tag},无法踢出对方`); } // 执行踢人逻辑 target.kick(reasonKick) .then(() => { message.channel.send(`**${target.user.tag}** 已被踢出,原因:**${reasonKick}**`); }) .catch(err => { message.reply(`踢出失败:${err.message}`); }); }, };
内容的提问来源于stack exchange,提问作者FinallyComplete
相关产品推荐
相关产品推荐

