Discord.js ban与kick命令运行异常问题求助
故障排查与修复方案
第一个问题:操作成功后ping的是命令发送者
这是代码本身的逻辑错误:你定义的tag变量取值是member.id,而member是触发命令的消息发送者,自然只会@发送命令的人。要@被操作的目标用户,直接使用获取到的targetMember对象即可,Discord.js 中GuildMember对象调用toString()时会自动返回<@用户ID>的提及格式,无需手动拼接模板字符串。
第二个问题:@了目标用户仍然提示需要指定用户
这个问题90%的概率是版本适配问题:
- 如果你使用的是Discord.js v13及以上版本,必须在Discord开发者后台的机器人配置页,开启
Privileged Gateway Intents分类下的Message Content Intent权限,否则机器人无法读取用户消息里的@提及、文本内容,自然识别不到你@的目标。 - 另外你直接从
members.cache取目标用户的逻辑有问题,如果目标用户不在本地缓存中,会返回空值,触发未指定用户的提示。
修正后的完整代码
// Ban Command command(client, 'ban', async (message) => { const { member, mentions } = message const senderTag = `<@${member.id}>` if (member.hasPermission('ADMINISTRATOR') || member.hasPermission('BAN_MEMBERS')) { const target = mentions.users.first() if (target) { // 改用fetch从服务器拉取成员,避免缓存缺失 const targetMember = await message.guild.members.fetch(target.id) await targetMember.ban() // 这里用targetMember就会自动@被封禁的用户 message.channel.send(`${targetMember} has been banned.`) } else { message.channel.send(`${senderTag} Please specify which user to ban.`) } } else { message.channel.send(`${senderTag} You do not have the permission to use this command.`) } }) // Kick Command command(client, 'kick', async (message) => { const { member, mentions } = message const senderTag = `<@${member.id}>` if (member.hasPermission('ADMINISTRATOR') || member.hasPermission('KICK_MEMBERS')) { const target = mentions.users.first() if (target) { const targetMember = await message.guild.members.fetch(target.id) await targetMember.kick() message.channel.send(`${targetMember} has been kicked.`) } else { message.channel.send(`${senderTag} Please specify which user to kick.`) } } else { message.channel.send(`${senderTag} You do not have the permission to use this command.`) } })
额外检查项
如果修改后还是识别不到@提及,检查你的client初始化代码是否声明了必要的权限意图,示例如下(以v14为例):
const { Client, GatewayIntentBits } = require('discord.js') const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent ] })
如果还是有问题,可以在const target = mentions.users.first()这行后面加console.log(mentions.users),运行命令后看控制台输出的集合是否为空,如果为空就确认是Intent配置的问题。
内容的提问来源于stack exchange,提问作者PrezOfTheUnitedIdiots
相关产品推荐
相关产品推荐

