首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不和,使提到的用户耳聋

不和,使提到的用户耳聋
EN

Stack Overflow用户
提问于 2019-10-22 01:30:55
回答 1查看 565关注 0票数 0

我可能误解了members对象在这里返回的是什么,但我试图在我的bot中测试一个deafen命令-- discord.js的文档声明,Message对象包含一个Mentions属性,该属性保存发送的消息中的所有有效提及,从这里,我可以进一步深入,从Mentions中深入到Members属性--它返回消息中提到的GuildMembers集合--这就是我想要的。当我试图从返回的集合中获取那些GuildMember对象时,问题就出现了--我不太确定我做错了什么,但我得到了返回错误。我的代码如下:

代码语言:javascript
复制
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);
        }
    },
};

在我的终端窗口中,我得到了一个错误:

代码语言:javascript
复制
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的文档可以找到这里

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-22 07:35:07

message.mentions.members返回一个GuildMembers和雪花的集合(一些唯一的标识符)。集合是映射类的扩展,其中映射是一个数组,每个项都有一个键和一个值属性。

在地图上循环时,就像使用for(const member of taggedMembers)时一样,每个项目(或者在您的例子中是member )都是一个键和一个值对。然后,您将尝试在这对上调用setDeaf方法,正如您已经看到的那样,该方法不起作用。

您想要的是只循环集合中的值。使用.forEach可以很容易地做到这一点。我将在下面添加一些示例代码:

代码语言:javascript
复制
taggedMembers.forEach((member) => {
    member.setDeaf(true)
        .then(() => console.log(`Deafened ${member.displayName}`))
        .catch(console.error);
});

试试看,如果你再遇到什么问题,请告诉我。

编辑:,正如邋遢在评论中指出的那样,即使在附加了.catch()之后,使用.forEach也不会捕捉到任何承诺拒绝。要解决这个问题,您可以使用for ... of循环,但可以销毁对。在下面的例子中可以看到这一点:

代码语言:javascript
复制
for (let [, member] of taggedMembers) {
    member.setDeaf(true)
        .then(() => console.log(`Deafened ${member.displayName}`))
        .catch(console.error);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58496021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档