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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 07:54:03