Discord.js — получение DisplayName члена Гильдии дает мне ошибку типа

#javascript #node.js #discord.js #typeerror

#javascript #node.js #discord.js #ошибка типа

Вопрос:

Я действительно не знаю, что здесь происходит. Мой код находится внутри фреймворка Akairo, но ошибка указывает во всех направлениях на 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:

В вашем коде есть небольшой логический недостаток: вы не проверяете, было ли сообщение отправлено в DMS. Если сообщение действительно было DM, то message.member оно было бы null (поскольку каналы DM не являются частью какого-либо сервера), что в значительной степени объясняет вашу ошибку.

Вы должны исправить это, либо явно проверив (и вернув), является ли канал DM, либо если это ложное значение

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

Ответ №2:

Ошибка типа: не удается прочитать свойство ‘DisplayName’ из null

Это означает, что «message.member» имеет значение null и не может найти свойство «DisplayName», что тогда имеет смысл.

Я думаю, нам нужно просмотреть больше вашего кода, чтобы выяснить, где что-то пошло не так. Я предполагаю, что вы пытаетесь запустить этот оператор if для объекта-члена, который не существует.