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.has
、member.roles.add
和 member.roles.remove
功能都可以使用了!
唯一仍然不起作用的函数是member.roles.some
,这是因为GuildMemberRoleManager
class只有add
,set
,和 remove
函数。 member.roles.some
函数可以更改为使用 member._roles
,因为它 returns 包含公会成员拥有的所有角色的字符串列表,并且可以这样做:
function hasRole(member, roleID) {
return member._roles.indexOf(roleID) >= 0;
}
我正在开发一个机器人,它需要在 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.has
、member.roles.add
和 member.roles.remove
功能都可以使用了!
唯一仍然不起作用的函数是member.roles.some
,这是因为GuildMemberRoleManager
class只有add
,set
,和 remove
函数。 member.roles.some
函数可以更改为使用 member._roles
,因为它 returns 包含公会成员拥有的所有角色的字符串列表,并且可以这样做:
function hasRole(member, roleID) {
return member._roles.indexOf(roleID) >= 0;
}