discord.js - 在 guild.roles 中获取未定义
问题描述
您好,我正在尝试编写一个 discordbot,它将公会 A 中的成员上的角色 A 同步到 guildB 这些角色由 ID 定义我遇到的问题是var users1 = guild1.roles.fetch(args[2]).members; //guild1role
抛出
(node:54852) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'fetch' of undefined
at SyncRole.run (D:\git\purgebot\Commands\General\syncrole.js:49:37)
at Message.run (D:\git\purgebot\Events\message.js:49:13)
at Luna.<anonymous> (D:\git\purgebot\Luna.js:92:83)
at Luna.emit (events.js:314:20)
at MessageCreateAction.handle (D:\git\purgebot\node_modules\discord.js\src\client\actions\MessageCreate.js:31:14)
at Object.module.exports [as MESSAGE_CREATE] (D:\git\purgebot\node_modules\discord.js\src\client\websocket\handlers\MESSAGE_CREATE.js:4:32)
at WebSocketManager.handlePacket (D:\git\purgebot\node_modules\discord.js\src\client\websocket\WebSocketManager.js:384:31)
at WebSocketShard.onPacket (D:\git\purgebot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:444:22)
at WebSocketShard.onMessage (D:\git\purgebot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:301:10)
at WebSocket.onMessage (D:\git\purgebot\node_modules\ws\lib\event-target.js:132:16)
这是同步角色部分的源代码(第 1 行 = 第 37 行)
const client = this.client;
if(message.member.guild.me.hasPermission('ADMINISTRATOR')) {
var guild1 = client.guilds.fetch(args[0]); //guildid1
var guild2 = client.guilds.fetch(args[1]); //guildid1
var users1 = guild1.roles.fetch(args[2]).members; //guild1role
var users2 = guild2.roles.fetch(args[3]).members; //guild2role
users2.members.forEach(user => {
user.remove(args[3]).catch(console.error);
message.channel.send("removed role " + args[3] + " for " + user.id);
})
users1.members.forEach(user =>{
guild2.members.forEach(user2 => {
if(user.id == user2.id) {
user2.addRole(args[3]);
message.channel.send("added role " + args[3] + " for " + user.id);
}
})
})
message.channel.send("roles synced");
} else {
message.channel.send("https://i.imgur.com/6cpffM4.jpg");
}
解决方案
GuildManager.fetch()
返回 a Promise
,必须先解决它,然后才能使用该Guild
对象。也一样RoleManager.fetch()
// using `Promise.prototype.then()`
client.guilds.fetch(args[0]).then((guildid1) => {
client.guilds.fetch(args[1]).then((guildid2) => {
let users1, users2;
guild1.roles.fetch(args[2]).then((role) => (users1 = role.members));
guild2.roles.fetch(args[3]).then((role) => (users2 = role.members));
// code...
});
});
// using `async/await`
// **make sure your function is `async`**
const guild1 = await client.guilds.fetch(args[0]);
const guild2 = await client.guilds.fetch(args[1]);
const users1 = (await guild1.roles.fetch(args[2])).members;
const users2 = (await guild2.roles.fetch(args[3])).members;
推荐阅读
- javascript - Creating a nesting layout with a fixed column that's scroll able
- c# - finding a combination sum to match a particular sum
- flutter - 行布局错误中的 Flutter GridView.count
- android - how to fix Error RuntimeException: Unable to start service on a null object reference when use System.exit(0);
- python - 创建一个开放的街道地图视图
- python - 我需要在一个循环中创建多个数据库连接吗?
- fortify - Fortify Audit Workbench add a comment under Issue summary using command line
- reactjs - Make WebStorm use alias for HTML tags in JSX
- python - Copying DynamoDB table of one account to another DynamoDB table in different account
- bash - Docker-compose - Starting container process caused "exec: \"/bin/sh\": stat /bin/sh: no such file or directory": unknown