Discord.js 机器人错误:在频道中宣布角色分配时出现“UnhandledPromiseRejectionWarning”

问题描述 投票:0回答:1

我正在使用discord.js 开发Discord 机器人。该机器人的目的是每当成员被分配特定角色之一(“alpha”、“bravo”、“charlie”、“delta”)时,就会在 #general 频道中发送祝贺消息。但是,我在实现中遇到了错误。

当前行为:

  • 分配角色后,机器人应在#general 中发布消息。
  • 我正在使用 guildMemberUpdate 事件来检测角色更改。

遇到的问题:

  • 我收到与代码中的角色比较相关的 UnhandledPromiseRejectionWarning 错误。
  • 错误指向我检查角色是否已更新的行。

代码片段:

client.on("guildMemberUpdate", async (oldMember, newMember) => {
    if (!oldMember.roles.cache.equals(newMember.roles.cache)) {
        let newRole;
        newMember.roles.cache.forEach((role) => {
            if (oldMember.roles.cache.has(role.id)) return;
            let roleNames = ["alpha", "bravo", "charlie", "delta"];
            if (roleNames.includes(role.name.toLowerCase())) {
                newRole = role;
            }
        });

        if(newRole) {
            const channel = oldMember.guild.channels.cache.find(channel => channel.name === "general");
            channel.send(`Congratulations on becoming part of the ${newRole.name} faction!`);
        }
    }
});

尝试解决:

  • 按照评论中的建议,我尝试使用
    if (!oldMember.roles.cache.equals(newMember.roles.cache))
    而不是
    if (oldMember.roles.cache !== newMember.roles.cache)
  • 我将
    .includes()
    替换为
    .has(role.id)
    以进行正确的角色比较。

尽管进行了这些更改,错误仍然存在。我不确定如何继续并解决此问题。

问题:

  1. 如何正确检测会员新增角色并在特定频道公告?
  2. 导致 UnhandledPromiseRejectionWarning 的原因是什么以及如何修复它?
javascript event-handling discord discord.js dom-events
1个回答
0
投票

查看

Client#guildMemberUpdate
,当有关
member
属性的某些内容发生更改(即添加角色)时,会发出该信号。尝试将此代码添加到您的机器人中:

client.on("guildMemberUpdate", async (oldMember, newMember) => {
  // On `guildMemberUpdate`

  if (!oldMember.roles.cache.equals(newMember.roles.cache)) {
    // Check if a role was updated

    let newRole;
    newMember.roles.cache.forEach((role) => {
      if (oldMember.roles.cache.includes(role)) return;
      // Check for the new role that was added

      let roleNames = ["alpha", "bravo", "charlie", "delta"];
      if (roleNames.toLowerCase().includes(role.name.toLowerCase())) {
        // Check for only `['alpha', 'bravo', 'charlie', 'delta']`
        newRole = role;
      }
    });

    // Anything you want to run here with the `newRole` data.
    const channel = oldMember.guild.channels.cache.find(
      (channel) => channel.name === "general"
    );
    channel.send("Congratulations on becoming part of the faction!");
  }
});
© www.soinside.com 2019 - 2024. All rights reserved.