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

Discord机器人权限验证异常求助:已配置KICK_MEMBERS权限仍提示无权限且曾遇hasPermission函数错误

解决Discord.js机器人权限相关问题

我来帮你梳理代码里的问题,以及对应的修复方案:

1. 权限判断逻辑完全写反了

这是导致你明明有权限却收到无权限提示的核心原因!你当前的代码是:

if (message.member.permissions.has('KICK_MEMBERS')) return message.reply('You do not have permission to use that command');

这段代码的意思是:如果用户拥有KICK_MEMBERS权限,就返回无权限提示,完全搞反了逻辑。应该加上取反运算符!,判断用户不具备该权限时才返回提示:

if (!message.member.permissions.has('KICK_MEMBERS')) return message.reply('You do not have permission to use that command');

Ban命令里的权限判断也犯了同样的错误,需要一起修正。

2. 缺少必要的Intents

你的机器人当前只启用了GUILDS和GUILD_MESSAGES,但处理成员踢/封操作需要GUILD_MEMBERS intent,另外如果是Discord.js v14+版本,读取消息内容还需要MESSAGE_CONTENT intent。更新你的Client初始化代码:

const client = new Client({ 
  intents: [
    "GUILDS", 
    "GUILD_MESSAGES", 
    "GUILD_MEMBERS", 
    "MESSAGE_CONTENT"
  ] 
});

同时要确保你在Discord开发者平台的机器人页面,已经开启了Privileged Gateway Intents里的Server Members Intent和Message Content Intent。

3. 修复Ban命令的调用方式

当前的message.guild.members.ban(args[0])缺少错误处理,直接用ID调用时最好补充异常捕获,同时要确保机器人自身有BAN_MEMBERS权限。修改成:

else if (CMD_NAME === 'ban') {
  if (!message.member.permissions.has('BAN_MEMBERS')) return message.reply('You do not have permission to use that command');
  if (args.length === 0) return message.reply('Please provide an ID.');
  message.guild.members.ban(args[0])
    .then(() => message.channel.send(`Member with ID ${args[0]} was banned`))
    .catch(err => message.channel.send('I do not have permissions to ban this member, or the member was not found.'));
}

4. 机器人自身的权限配置

别忘了给你的机器人角色分配KICK_MEMBERS和BAN_MEMBERS权限!在Discord服务器的角色设置里,找到机器人的角色,确保这两个权限是勾选状态,并且机器人的角色位置要高于被踢/封成员的角色位置,否则机器人无法执行操作。

完整修正后的代码

require('dotenv').config();
const {Client} = require('discord.js');
const client = new Client({ 
  intents: [
    "GUILDS", 
    "GUILD_MESSAGES", 
    "GUILD_MEMBERS", 
    "MESSAGE_CONTENT"
  ] 
});
const PREFIX = "y!";

client.on('ready', () => {
 console.log(`${client.user.tag} has logged in.`);
});

client.on('messageCreate', (message) => {
 if (message.author.bot) return;
 console.log(`[${message.author.tag}]: ${message.content}`);

 if (message.content === 'hello') {
 message.reply('konnichiwa');
 message.channel.send('mata konnichiwa');
 message.channel.send('konnichiwa');
 }

 if (message.content.startsWith(PREFIX)) {
 const [CMD_NAME, ...args] = message.content
 .trim()
 .substring(PREFIX.length)
 .split(/\s+/);
 console.log(CMD_NAME);
 console.log(args);

 if (CMD_NAME === 'kick') {
 // 修正权限判断逻辑
 if (!message.member.permissions.has('KICK_MEMBERS')) return message.reply('You do not have permission to use that command');
 if (args.length === 0) return message.reply('Please provide an ID.');
 const member = message.guild.members.cache.get(args[0]);
 if (member) {
 member
 .kick()
 .then((member) => message.channel.send(`${member} was kicked`))
 .catch((err) => message.channel.send('I do not have permissions to kick this member, or the member is higher than me in role hierarchy.'));
 } else {
 message.channel.send('That member was not found...');
 }
 } else if (CMD_NAME === 'ban') {
 // 修正权限判断逻辑
 if (!message.member.permissions.has('BAN_MEMBERS')) return message.reply('You do not have permission to use that command');
 if (args.length === 0) return message.reply('Please provide an ID.');
 message.guild.members.ban(args[0])
 .then(() => message.channel.send(`Member with ID ${args[0]} was banned`))
 .catch(err => message.channel.send('I do not have permissions to ban this member, or the member was not found.'));
 }
 }
})

client.login(process.env.DISCORDJS_BOT_TOKEN);

关于你之前遇到的(hasPermission) is not a function错误,确实是因为教程用了旧版Discord.js(v12及以前),而你现在用的是v13+版本,新版本把hasPermission()方法改成了permissions.has()属性,所以现在代码里的写法是正确的,只要修正上面的问题就能正常运行了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:44:06