【问题标题】:'Cannot read property "id" of undefined' when trying to check a role when a role is changed with discord.js当使用 discord.js 更改角色时尝试检查角色时,“无法读取未定义的属性“id””
【发布时间】:2021-09-29 06:00:31
【问题描述】:

每当我给予或接受某人的角色时(或者如果像 hyperlabs 之类的东西赋予他们角色),我都会尝试更改我的数据库中的变量。它会注意到我何时给予或取消角色,但我似乎无法弄清楚如何正确措辞以找到角色 ID。

这是我目前正在使用的代码。

///Check for if a guild owner gained or lost the paid role
bot.on('guildMemberUpdate', async (oldMember, newMember) => {
    let test1 = oldMember;
    console.log(test1);
    let test2 = newMember.roles.cache.some(r => r.name === `${[process.env.PAID_ROLE]}`);
    console.log(test2);
    if (test1 > test2 || test1 === null){
        console.log('role change');
    } else {
        return;
    }
});

console.log(test1) 通过时,我会得到这个作为回报。 (x 是我取出 ids。我没有得到 x 回来。)

GuildMember {
    guild: <ref *1> Guild {
      members: GuildMemberManager {
        cacheType: [class Collection extends Collection],
        cache: [Collection [Map]],
        guild: [Circular *1]
      },
      channels: GuildChannelManager {
        cacheType: [class Collection extends Collection],
        cache: Collection(0) [Map] {},
        guild: [Circular *1]
      },
      roles: RoleManager {
        cacheType: [class Collection extends Collection],
        cache: Collection(0) [Map] {},
        guild: [Circular *1]
      },
      presences: PresenceManager {
        cacheType: [class Collection extends Collection],
        cache: Collection(0) [Map] {}
      },
      voiceStates: VoiceStateManager {
        cacheType: [class Collection extends Collection],
        cache: Collection(0) [Map] {},
        guild: [Circular *1]
      },
      deleted: false,
      available: false,
      id: 'xxxxxxxxxxxxxxxxx',
      shardID: 0
    },
    joinedTimestamp: 1626625250120,
    lastMessageID: null,
    lastMessageChannelID: null,
    premiumSinceTimestamp: 0,
    deleted: false,
    nickname: null,
    _roles: [ '865042563555000350' ],
    user: User {
      id: 'xxxxxxxxxxxxxxxxxxx',
      system: null,
      locale: null,
      flags: UserFlags { bitfield: 0 },
      username: 'xxxxxxx',
      bot: false,
      discriminator: '9770',
      avatar: '292a70982b25628322b90ffea55b0d57',
      lastMessageID: null,
      lastMessageChannelID: null
    }
}

我还尝试了一种方法,将.roles.cache.sizeoldMembernewMember 取为newMember 并写道: 如果旧成员的缓存大小大于或小于新成员,则检查角色并相应更新

但这给了我一个错误:

无法读取未定义的属性“id”。

有人说这不起作用的原因是角色部分不可读,我如何称呼它或类似的东西。我不记得他悲伤地说了什么。

编辑:Sourcebin 链接到整个 index.js,因为这可能是此代码块之外的问题。

https://sourceb.in/wQxrROfX9A

【问题讨论】:

  • 这能回答你的问题吗? Find out if someone has a role
  • 是和不是。是的,因为您让我注意到 r.name 正在尝试查找角色的名称,而我正在为其提供角色 ID。感谢那。但也没有,因为您调用成员的方式与此功能略有不同。即 newMember 和 oldMember 部分

标签: javascript discord.js


【解决方案1】:
if (test1 > test2 || test1 === null){
    console.log('role change');
}

在 if 条件中,您正在检查 GuildMember 类型的对象是否大于布尔值。这每次都会给你错误。

由于 test1 永远不会为空,因此 if 语句的整体结果为 false

为了解决这个问题,您可以检查 oldMember 的角色缓存是否也有名称为 process.env.PAID_ROLE 的角色。

例子:

let test1 = oldMember.roles.cache.some(r => r.name === `${[process.env.PAID_ROLE]}`);

然后你应该用那个语句替换 if 语句:

if (test1 !== test2) {
    console.log("role change");
} else {
    return;
}

(顺便说一句,此语句仅在用户删除或添加process.env.PAID_ROLE 时才会触发)

【讨论】:

  • !== 部分的好主意。简单得多。我马上试试上面的部分。
  • 是的,我仍然得到未定义的“无法读取属性”id。还试图让它找到角色名称以进行健全性检查,这也说了同样的话:(我也试图改变r.name 到 r.id 看看是否会尝试查找 id 而不是名称,但它不会
  • 你能告诉我你到底在哪里得到这个错误,因为你从来没有使用过任何与 ID 相关的东西
  • 当我改变时让 test1 = oldMember;让 test1 = oldMember.roles.cache.some(r => r.name === ${[process.env.PAID_ROLE]});我得到和以前一样的错误。如果我保持它为 let test1 = oldMember,当我做同样的事情时,我会在下一行得到错误。就像我说的那样,这就是我将 r.name 更改为 r.id 的原因,因为我注意到我正在寻找名称而不是 id。但即使将 r.name 更改为 r.id 我也会遇到同样的错误
  • 我把它分解为 let test1 = oldMember.roles 它给了我相同的成员对象,就好像我确实让 test1 = oldMember 所以我认为它根本没有获取角色是问题跨度>
猜你喜欢
  • 2021-08-10
  • 2021-04-07
  • 2019-01-25
  • 2021-11-01
  • 1970-01-01
  • 2020-12-29
  • 2022-01-13
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多