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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 20:18:03