Discord.js - 获取 GuildMember 的 displayName 给我一个 TypeError

Posted

技术标签:

【中文标题】Discord.js - 获取 GuildMember 的 displayName 给我一个 TypeError【英文标题】:Discord.js - getting a GuildMember's displayName gives me a TypeError 【发布时间】:2021-02-10 05:41:33 【问题描述】:

我真的不知道这里发生了什么。我的代码在 Akairo Framework 内,但错误指向 discord.js 本身的各个方向。这是错误:

/home/runner/guard/Listeners/automod/nicknames.js:14
            if (message.member.displayName.includes(word)) 
                               ^

TypeError: Cannot read property 'displayName' of null
    at module.exports.exec (/home/runner/guard/Listeners/automod/nicknames.js:14:32)
    at Client.emit (events.js:327:22)
    at Client.EventEmitter.emit (domain.js:483:12)
    at MessageCreateAction.handle (/home/runner/guard/node_modules/discord.js/src/client/actions/MessageCreate.js:31:14)
    at Object.module.exports [as MESSAGE_CREATE] (/home/runner/guard/node_modules/discord.js/src/client/websocket/handlers/MESSAGE_CREATE.js:4:32)
    at WebSocketManager.handlePacket (/home/runner/guard/node_modules/discord.js/src/client/websocket/WebSocketManager.js:384:31)
    at WebSocketShard.onPacket (/home/runner/guard/node_modules/discord.js/src/client/websocket/WebSocketShard.js:444:22)
    at WebSocketShard.onMessage (/home/runner/guard/node_modules/discord.js/src/client/websocket/WebSocketShard.js:301:10)
    at WebSocket.onMessage (/home/runner/guard/node_modules/ws/lib/event-target.js:125:16)
    at WebSocket.emit (events.js:315:20)

这是我的代码:(bannedWords 是一个字符串数组,我运行它来检查成员的昵称)(它在 message 事件侦听器中)

const bannedWords = require('./badwords.json').words;
for (const word of bannedWords) 
    if (message.member.displayName.includes(word)) 
        message.member.setNickname(`Moderated Nickname`)
    

【问题讨论】:

【参考方案1】:

TypeError: 无法读取 null 的属性“displayName”

这意味着“message.member”为空,它找不到属性“displayName”,这是有道理的。

我认为我们需要查看您的更多代码才能找出问题所在。我猜你正试图在一个不存在的成员对象上运行该 if 语句。

【讨论】:

【参考方案2】:

您的代码中存在一些逻辑缺陷:您没有检查消息是否在 DM 中发送。如果消息确实是 DM,那么 message.member 将为空(因为 DM 通道不属于任何服务器),这几乎可以解释您的错误。

您应该通过显式检查(并返回)频道是否为 DM 或是否为假值来解决此问题

//some code ...
if(!message.member) return;
for (const word of bannedWords) 
    if (message.member.displayName.includes(word)) 
        message.member.setNickname(`Moderated Nickname`)
    

【讨论】:

以上是关于Discord.js - 获取 GuildMember 的 displayName 给我一个 TypeError的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js 城市字典节点获取

Discord.js 通过昵称获取用户

Discord.js 作为机器人获取用户连接

Discord.js 无法读取未定义的属性“获取”

Discord.js - 在前缀和命令之后获取信息

TypeError:无法读取未定义的“获取”函数(discord.js)