Discord JavaScript bot 通过用户ID踢人返回用户未找到错误
问题原因排查与修复方案
1. 核心逻辑错误
你代码中的成员存在性判断完全不符合预期:message.guild.members.cache.get() 方法的返回值只有两种可能:匹配到成员时返回 GuildMember对象,未匹配到时返回 undefined,二者都不可能和布尔值true严格相等。因此if (member === true)判断永远不通过,直接执行else分支返回「That member was not found」。
2. 缓存未命中问题
Discord.js 只会将近期触发过服务器事件的成员信息存储在本地缓存中,若目标用户长时间未在服务器活跃,就算输入的ID完全正确,cache.get()也会返回undefined。
3. 潜在权限遗漏问题
你仅校验了命令使用者的踢人权限,未校验机器人自身的权限:机器人需要拥有KICK_MEMBERS权限,且自身角色层级高于被踢用户的角色层级,才能完成踢人操作。
修正后代码示例
if(CMD_NAME === 'kick') { // 校验命令使用者权限 if (!message.member.hasPermission('KICK_MEMBERS')) return message.reply('You do not have permissions to use that command'); if (args.length === 0) return message.reply('Please provide an ID'); // 校验机器人自身权限 if (!message.guild.me.hasPermission('KICK_MEMBERS')) return message.reply('I do not have permission to kick members'); try { // 优先读缓存,缓存未命中时主动拉取成员信息 const member = message.guild.members.cache.get(args[0]) || await message.guild.members.fetch(args[0]); member.kick() .then((kickedMember) => message.channel.send(`${kickedMember} was kicked.`)) .catch((err) => message.channel.send('I cannot kick that user :(')); } catch (e) { // 拉取失败说明ID对应的成员不在本服务器 message.channel.send('That member was not found'); } }
注意:如果你的代码外层不是异步函数,需要给触发命令的事件回调函数加上
async关键字,否则await会报错。
内容的提问来源于stack exchange,提问作者Captain Tiger
相关产品推荐
相关产品推荐

