【问题标题】:Creating a role, then giving the role to a member doesn't work, is there a better way to handle this? Discord.js创建角色,然后将角色赋予成员不起作用,有没有更好的方法来处理这个问题?不和谐.js
【发布时间】:2026-01-28 17:40:01
【问题描述】:

我想根据消息创建一个角色,然后在创建该角色后,我想将其提供给同一消息中提到的那些。角色创建得非常好,但没有给用户正确的角色。

我试过按名字命名,但这会导致找不到角色,所以我试图根据角色所处的位置来获取角色,但是当我需要分配角色时,它似乎不在那个正确的位置

var nameOC = getClanName(message.content);
        console.log(nameOC);
        message.guild.createRole({
            name: nameOC,
            hoist: true,
            mentionable: false,
            position: 1,
        });
        var role = message.guild.roles.find(role => role.position === 1);
        console.log(role);
        list.members.forEach(member => {
           if(message.content.includes(member)){
              member.addRoles(role);          
            }
        });
        message.channel.send(nameOC);

使用正确的名称可以完美地制作角色,但是它给出的角色是以前的第一个角色,而不是刚刚创建的角色。

【问题讨论】:

    标签: javascript discord discord.js


    【解决方案1】:

    同步与异步

    假设您打算接您的朋友去参加体育赛事。你不确定他们希望你什么时候来,所以你给他们打电话问他们。他们想了一会儿,然后告诉你一个时间。你得到了你要求的信息,所以你挂断了。在编程术语中,这将是同步代码的示例(有时被认为是 Node.js 中的“正常”代码)。

    让自己回到同样的境地。然而,当你这次打电话给你的朋友时,他们很忙。你不想打扰他们,所以你让他们稍后给你打电话。你挂断了,但现在你等着。一个小时后,他们给你回电话,告诉你时间。这就是异步代码的思考过程。

    屏幕后面还有很多内容,但为简单起见,我不会用所有这些信息轰炸你。


    承诺

    Promise 对象表示异步操作的最终完成(或失败)及其结果值。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

    Guild.createRole() 方法返回一个 Promise。

    Promise 处于以下状态之一:

    • pending:初始状态,既不履行也不拒绝。
    • fulfilled:表示操作成功完成。
    • rejected:表示操作失败。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

    虽然您调用了该方法来创建角色,但它并不是即时创建的。 Promise 处于 pending 状态。


    解决方案

    那么,我们如何检索 Promise 的结果?我们必须等待它。

    • 保持简单的流程,您可以使用await 关键字。它所做的只是等待 Promise 被履行或拒绝,然后再继续执行进一步的代码。考虑以下示例:

      // Asynchronous context (meaning within an async function) needed to use 'await.'
      
      var role = await message.guild.createRole(...);
      console.log(role);
      // Continue using the 'role' variable...
      
    • 或者,您可以使用then() 链。回调将在 Promise 实现时使用返回的值调用。在某些情况下,这很简单。但是,回调很快就会变得混乱,并且返回值的范围会受到限制。考虑这个例子:

      message.guild.createRole(...)
        .then(role => {
          console.log(role);
          // Continue using the 'role' variable...
        });
      

    错误处理

    当一个 Promise 被拒绝时,这意味着出现了问题。必须捕获源自被拒绝的 Promise 的错误。如果不是,您将在控制台中收到带有错误的警告。

    • 您可以附加catch() 方法,其工作方式与then() 类似,除了将错误作为其回调参数返回并且仅在被拒绝时调用。考虑这个精简的例子:

      message.guild.createRole(...)
        .then(role => {...})
        .catch(console.error);
      
    • 您可以使用try...catch 语句,而不是附加多个catch() 方法。如果 try 块内的任何 Promise 被拒绝,catch 块内的代码将被执行。例如:

      try {
        var role = await message.guild.createRole(...);
        await role.delete(); // Maybe not a logical example...
      } catch(err) {
        console.error(err);
      }
      

    资源

    【讨论】:

    • 我从那条评论中学到了很多,这一切都更有意义,你是一个传奇。
    最近更新 更多