【问题标题】:discord.js how to find role by namediscord.js 如何按名称查找角色
【发布时间】:2021-04-24 21:21:00
【问题描述】:

我正在尝试制作一个简单的注册功能,但我无法弄清楚问题所在。这是代码:

fasz.on('messageReactionAdd', async (msg, guild,  reaction, user) =>{
    let registered = msg.guild.roles.find(role => role.name === "Regisztrált");
    if(reaction.message.partial) await reaction.message.fetch();
    if(reaction.partial) await reaction.fetch();
    if(user.bot) return;
    if(!reaction.message.guild) return;
    if(reaction.message.channel.id === '718990681745522728'){
        if(reaction.emoji.name === '????'){
            await reaction.message.guild.members.cache.get(user.id).roles.add(registered)
            return user.send('Sikeres regisztráció! Üdvözlünk a szerveren!')

        }
    }
})

这是得到的错误信息:

C:\Users\god\Documents\GitHub\discord.js\main.js:74
    let registered = msg.guild.roles.find(role => role.name === "Regisztrált");
                               ^

TypeError: Cannot read property 'roles' of undefined
    at Client.<anonymous> (C:\Users\god\Documents\GitHub\discord.js\main.js:74:32)
    at Client.emit (node:events:376:20)
    at MessageReactionAdd.handle (C:\Users\god\Documents\GitHub\discord.js\node_modules\discord.js\src\client\actions\MessageReactionAdd.js:49:17)
    at Object.module.exports [as MESSAGE_REACTION_ADD] (C:\Users\god\Documents\GitHub\discord.js\node_modules\discord.js\src\client\websocket\handlers\MESSAGE_REACTION_ADD.js:4:37)
    at WebSocketManager.handlePacket (C:\Users\god\Documents\GitHub\discord.js\node_modules\discord.js\src\client\websocket\WebSocketManager.js:384:31)
    at WebSocketShard.onPacket (C:\Users\god\Documents\GitHub\discord.js\node_modules\discord.js\src\client\websocket\WebSocketShard.js:444:22)
    at WebSocketShard.onMessage (C:\Users\god\Documents\GitHub\discord.js\node_modules\discord.js\src\client\websocket\WebSocketShard.js:301:10)
    at WebSocket.onMessage (C:\Users\god\Documents\GitHub\discord.js\node_modules\ws\lib\event-target.js:132:16)
    at WebSocket.emit (node:events:376:20)
    at Receiver.receiverOnMessage (C:\Users\god\Documents\GitHub\discord.js\node_modules\ws\lib\websocket.js:835:20)

【问题讨论】:

  • 你应该直接尝试使用msg.guild.roles.find(),而不是guild.roles.find()
  • 现在我收到此错误消息,我尝试获取,并取而代之找到,但它们都不起作用。让已注册 = guild.roles.find(role => role.name === "Regisztrált"); ^ 类型错误:无法读取未定义的属性“查找”
  • 经过一番调查,我发现Client#messageReactionAdd 事件只发出MessageReactionuser。这意味着您不能将四个变量传递给您的函数,只能传递两个。

标签: javascript discord.js


【解决方案1】:

就像我在评论中提到的,Client#messageReactionAdd 事件只发出两个变量。这意味着您不能随意使用四个变量来分配它。

代码:

client.on('messageReactionAdd', async (reaction, user) => { //basically changed four to two variables
    //replaced msg.guild.roles.find() with reaction.message.guild.roles.find()
    let registered = reaction.message.guild.roles.find(role => role.name === "Regisztrált");
    if (reaction.message.partial) await reaction.message.fetch();
    if (reaction.partial) await reaction.fetch();
    if (user.bot) return;
    if (!reaction.message.guild) return;
    if (reaction.message.channel.id === '718990681745522728') {
        if (reaction.emoji.name === '?') {
            await reaction.message.guild.members.cache.get(user.id).roles.add(registered)
            return user.send('Sikeres regisztráció! Üdvözlünk a szerveren!')
        }
    }
});

【讨论】:

    【解决方案2】:

    您可以通过它的名称获得role,如下所示:

    const role = reaction.message.guild.roles.cache.find(r => r.name === 'Yor role name');
    

    获取role 后,您可以获取user 并分配role

    const { guild } = reaction.message
    
    const member = guild.members.cache.find(member => member.id === user.id);
    
    member.roles.add(role);
    

    【讨论】:

    • 不仅message没有定义,而且你需要使用cache来获取公会的缓存角色集合。
    • @ItamarS Jup,对不起。我更新了答案
    猜你喜欢
    • 2020-09-07
    • 2021-11-02
    • 2019-02-04
    • 2017-08-25
    • 2021-08-25
    • 1970-01-01
    • 2021-08-28
    • 2020-10-06
    • 2018-04-15
    相关资源
    最近更新 更多