TypeError: member.roles.add is not a function (discord.js v13)

TypeError: member.roles.add is not a function (discord.js v13)

我正在开发一个机器人,它需要在 giving/removing 来自用户的角色之前检查一些事情,但由于某种原因,.has().some().add().remove() 函数不起作用。

这是我的代码:

const Permissions = require('discord.js');

function isAdmin(member) {
    return member.permissions.has(Permissions.FLAGS.ADMINISTRATOR);
}

function hasRole(member, roleID) {
    return member.roles.some(role => role.id === roleID);
}

function giveRole(member, role) {
    member.roles.add(role)
}

function removeRole(member, role) {
    member.roles.remove(role);
}

这是我得到的完整错误:

TypeError: member.roles.add is not a function
    at Object.giveRole (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\util.js:101:30)
    at Object.buttonClicked (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\commands\buttonRole\execute.js:23:14)
    at WebSocketManager.<anonymous> (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\index.js:101:28)
    at WebSocketManager.emit (node:events:390:28)
    at WebSocketShard.onMessage (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\node_modules\discord.js\src\client\websocket\WebSocketShard.js:300:54)
    at WebSocket.onMessage (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\node_modules\ws\lib\event-target.js:199:18)
    at WebSocket.emit (node:events:390:28)
    at Receiver.receiverOnMessage (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\node_modules\ws\lib\websocket.js:1137:20)
    at Receiver.emit (node:events:390:28)
    at Receiver.dataMessage (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\node_modules\ws\lib\receiver.js:528:14)
    at Receiver.getData (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\node_modules\ws\lib\receiver.js:446:17)
    at Receiver.startLoop (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\node_modules\ws\lib\receiver.js:148:22)
    at Receiver._write (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\node_modules\ws\lib\receiver.js:83:10)
    at writeOrBuffer (node:internal/streams/writable:389:12)
    at _write (node:internal/streams/writable:330:10)
    at Receiver.Writable.write (node:internal/streams/writable:334:10)
    at TLSSocket.socketOnData (C:\Users\Admin\OneDrive\Documents\Github Projects\discordBots-BOK-BOT\node_modules\ws\lib\websocket.js:1231:35)
    at TLSSocket.emit (node:events:390:28)
    at addChunk (node:internal/streams/readable:315:12)
    at readableAddChunk (node:internal/streams/readable:289:9)
    at TLSSocket.Readable.push (node:internal/streams/readable:228:10)
    at TLSWrap.onStreamRead (node:internal/stream_base_commons:199:23)

在对角色进行任何操作时,以及大多数一般情况下,您需要通过 cache 访问它,例如:

  function hasRole(member, roleID) {
      return member.roles.cache.some(role => role.id === roleID);
  }

在 Discord.js 版本 12 中,语法大部分发生了变化。缓存 属性 现在包含了很多角色的缓存,你有可能需要使用 Promise 并获取它...

// in an ASYNC FUNCTION
let roles = await member.roles.fetch();
return roles.some(role => role.id === roleID);

你试过这样吗?

var role = message.guild.roles.cache.find(role => role.name === "Role_Name")
member.roles.add(role)

var role = message.guild.roles.cache.find(role => role.id === "Role_Id")
member.roles.add(role)

看了 Discord.js class 之后,我发现你不能简单地使用

let member = interaction.member;

获得公会成员,但是,你必须做

let member = await guild.members.fetch("ID");

这样做之后,member.permissions.hasmember.roles.addmember.roles.remove 功能都可以使用了!

唯一仍然不起作用的函数是member.roles.some,这是因为GuildMemberRoleManagerclass只有addset,和 remove 函数。 member.roles.some 函数可以更改为使用 member._roles,因为它 returns 包含公会成员拥有的所有角色的字符串列表,并且可以这样做:

function hasRole(member, roleID) {
    return member._roles.indexOf(roleID) >= 0;
}