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

使用discord.js为特定用户移除角色时遇问题求助

问题分析

报错TypeError: Cannot read properties of undefined (reading 'remove')的核心原因有三点:

  1. get_react_user函数内部引用了未定义的msg和guild变量,导致函数执行出错,无法正确返回GuildMember实例。
  2. 调用get_react_user时没有使用await,导致react_user是一个Promise对象而非实际的成员对象,自然没有roles属性。
  3. 直接使用的user是Discord的User对象,该对象没有角色操作权限,必须获取对应的GuildMember对象才能修改角色。
修复后的代码
const TOKEN = process.env['token'];
const GUILD_ID = process.env['guild_id'];
const Discord = require("discord.js");

const client = new Discord.Client({
    intents: [
        Discord.GatewayIntentBits.Guilds,
        Discord.GatewayIntentBits.GuildMessages,
        Discord.GatewayIntentBits.MessageContent,
        Discord.GatewayIntentBits.GuildMembers,
        Discord.GatewayIntentBits.GuildMessageReactions
    ]
});

// 重构获取成员的函数,传入guild和用户ID
async function getReactUser(guild, userId) {
    try {
        return await guild.members.fetch(userId);
    } catch (err) {
        console.error('获取成员失败:', err);
        return null;
    }
} 

client.on("ready", () => {
    console.log('机器人已上线');
    // 使用async/await简化链式调用,避免回调地狱
    (async () => {
        try {
            const channel = await client.channels.fetch("1057682369739489312");
            const message = await channel.messages.fetch("1057813574799609906");
            const guild = client.guilds.cache.get(GUILD_ID);
            
            if (!guild) {
                console.error('无法获取指定服务器');
                return;
            }

            const filter = (reaction, user) => ["✅", "❌"].includes(reaction.emoji.name);
            const collector = message.createReactionCollector({ filter });

            collector.on('collect', async (reaction, user) => {
                // 排除机器人自身的反应
                if (user.bot) return;

                if (reaction.emoji.name === "✅") {
                    const role = guild.roles.cache.find(role => role.name === 'Newcomer');
                    if (!role) {
                        console.error('未找到Newcomer角色');
                        return;
                    }

                    try {
                        // 发送私信
                        await user.send("测试成功,角色将被移除");
                        // 获取GuildMember对象
                        const reactUser = await getReactUser(guild, user.id);
                        if (!reactUser) {
                            await user.send('无法获取你的成员信息,无法移除角色');
                            return;
                        }
                        // 移除角色
                        await reactUser.roles.remove(role);
                        await user.send('Newcomer角色已成功移除');
                    } catch (err) {
                        console.error('操作失败:', err);
                        await user.send('操作过程中出现错误,请联系管理员');
                    }
                }
            });
        } catch (err) {
            console.error('初始化收集器失败:', err);
        }
    })();
});

client.login(TOKEN);
关键修复点
  • 重构getReactUser函数,传入guild参数,确保能正确从服务器获取成员,同时添加错误捕获。
  • 将collect事件的回调改为async函数,使用await等待异步操作完成,避免Promise未解析就操作。
  • 排除机器人自身的反应,避免不必要的操作。
  • 增加角色、成员获取的存在性检查,提前处理异常情况。
  • 使用async/await替换链式then,让代码更易读和维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:45:18