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

Discord机器人频道删除时踢人失败:TypeError问题求助

问题:Discord审核机器人无法踢除删除频道的用户

我给自己的Discord服务器开发自定义审核机器人,已经实现频道删除检测功能,但执行踢除操作时失败,控制台抛出TypeError: member.kick is not a function错误。打印操作人对象时,返回的是User类型数据,而非GuildMember类型。

报错信息

node:events:495
      throw er; // Unhandled 'error' event
      ^

TypeError: member.kick is not a function
    at Client.<anonymous> (C:\Users\Nathan\Documents\Real-Anti-Raid-Bot\src\index.js:167:16)
Emitted 'error' event on Client instance at:
    at emitUnhandledRejectionOrErr (node:events:398:10)
    at process.processTicksAndRejections (node:internal/process/task_queues:84:21)

Node.js v18.20.3
[nodemon] app crashed - waiting for file changes before starting...

原代码

client.on('channelDelete', async (channel) => {
    // Get the channel ID
    const channelDeleteId = channel.id;
    
    // Fetch all channel deletions from the audit log
    const auditLogs = await channel.guild.fetchAuditLogs({ type: 12 });

    // Find the log entry for this specific channelrs

    const channelDeleteEntry = auditLogs.entries.find((entry) => entry.target.id === channelDeleteId);
    if (channelDeleteEntry) {
        const deleter = channelDeleteEntry.executor;
        const member = deleter
        member.kick();
        
        console.log(`User ${deleter.username} deleted channel ${channel.name} at time ${channelDeleteEntry.createdAt}`);
    }
});

问题原因

channelDeleteEntry.executor返回的是User全局用户对象,而Discord.js中只有GuildMember服务器成员对象才拥有kick()方法。User对象仅包含用户的全局信息,不具备服务器内的权限操作能力。

解决方案

从目标服务器中获取对应用户的GuildMember实例,再执行踢人操作。同时添加异常处理,避免因权限不足等情况导致机器人崩溃。

修改后的代码

client.on('channelDelete', async (channel) => {
    const channelDeleteId = channel.id;
    const auditLogs = await channel.guild.fetchAuditLogs({ type: 12 });
    const channelDeleteEntry = auditLogs.entries.find(entry => entry.target.id === channelDeleteId);

    if (channelDeleteEntry) {
        const deleter = channelDeleteEntry.executor;
        try {
            // 获取服务器内的成员实例
            const member = await channel.guild.members.fetch(deleter.id);
            // 执行踢人操作,可自定义理由
            await member.kick('删除服务器频道');
            console.log(`已踢除用户 ${deleter.username},原因:删除频道 ${channel.name}`);
        } catch (err) {
            console.error('踢人操作失败:', err);
        }
    }
});

注意事项

  • 确保机器人拥有踢除成员的服务器权限
  • 机器人的角色位置必须高于被踢用户的角色层级,否则无法执行操作
  • 用try/catch包裹踢人逻辑,处理权限不足、目标用户是服务器所有者等异常情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:59:59