我可能误解了members对象在这里返回的是什么,但我试图在我的bot中测试一个deafen命令-- discord.js的文档声明,Message对象包含一个Mentions属性,该属性保存发送的消息中的所有有效提及,从这里,我可以进一步深入,从Mentions中深入到Members属性--它返回消息中提到的GuildMembers集合--这就是我想要的。当我试图从返回的集合中获取那些GuildMember对象时,问题就出现了--我不太确定我做错了什么,但我得到了返回错误。我的代码如下:
module.exports = {
name: 'deafen',
cooldown: 5,
description: 'Deafens mentioned user or users.',
args: true,
execute(message) {
const taggedMembers = message.mentions.members;
for(const member of taggedMembers) {
member.setDeaf(true)
.then(() => console.log(`Deafened ${member.displayName}`))
.catch(console.error);
}
},
};在我的终端窗口中,我得到了一个错误:
TypeError: member.setDeaf is not a function
at Object.execute (/home/tai/dev/FutabaBot/commands/admin/deafen.js:10:20)
at Client.<anonymous> (/home/tai/dev/FutabaBot/FutabaBot.js:80:17)
at Client.emit (events.js:210:5)
at MessageCreateHandler.handle (/home/tai/dev/FutabaBot/node_modules/discord.js/src/client/websocket/packets/handlers/MessageCreate.js:9:34)
at WebSocketPacketManager.handle (/home/tai/dev/FutabaBot/node_modules/discord.js/src/client/websocket/packets/WebSocketPacketManager.js:105:65)
at WebSocketConnection.onPacket (/home/tai/dev/FutabaBot/node_modules/discord.js/src/client/websocket/WebSocketConnection.js:333:35)
at WebSocketConnection.onMessage (/home/tai/dev/FutabaBot/node_modules/discord.js/src/client/websocket/WebSocketConnection.js:296:17)
at WebSocket.onMessage (/home/tai/dev/FutabaBot/node_modules/ws/lib/event-target.js:120:16)
at WebSocket.emit (events.js:210:5)
at Receiver.receiverOnMessage (/home/tai/dev/FutabaBot/node_modules/ws/lib/websocket.js:789:20)我不确定是否有必要,但我可以发布与此相关的其他代码,discord.js的文档可以找到这里
发布于 2019-10-22 07:35:07
message.mentions.members返回一个GuildMembers和雪花的集合(一些唯一的标识符)。集合是映射类的扩展,其中映射是一个数组,每个项都有一个键和一个值属性。
在地图上循环时,就像使用for(const member of taggedMembers)时一样,每个项目(或者在您的例子中是member )都是一个键和一个值对。然后,您将尝试在这对上调用setDeaf方法,正如您已经看到的那样,该方法不起作用。
您想要的是只循环集合中的值。使用.forEach可以很容易地做到这一点。我将在下面添加一些示例代码:
taggedMembers.forEach((member) => {
member.setDeaf(true)
.then(() => console.log(`Deafened ${member.displayName}`))
.catch(console.error);
});试试看,如果你再遇到什么问题,请告诉我。
编辑:,正如邋遢在评论中指出的那样,即使在附加了.catch()之后,使用.forEach也不会捕捉到任何承诺拒绝。要解决这个问题,您可以使用for ... of循环,但可以销毁对。在下面的例子中可以看到这一点:
for (let [, member] of taggedMembers) {
member.setDeaf(true)
.then(() => console.log(`Deafened ${member.displayName}`))
.catch(console.error);
}https://stackoverflow.com/questions/58496021
复制相似问题