簡體   English   中英

Discord.js:Linkblocker TypeError:無法讀取 null 的屬性“角色”

[英]Discord.js: Linkblocker TypeError: Cannot read property 'roles' of null

我目前正在嘗試在 discord.js 中編寫鏈接阻止程序。 僅當您不在具有正確 ID 的組中時,才應刪除該鏈接。

我的代碼:

client.on('message', (message) => {
    if(!message.member.roles.cache.has('835605932317868042')) { //<- Group ID
        if (message.content.includes('discord.gg/')) {
            message.delete()
            .then(message.channel.send('<@!' + message.member + '>' + config.link_deleted_chat_message))
            .then(message.member.send('<@!' + message.member + '>' + config.link_deleted_dm_message))
        }
        else if (message.content.includes('discordapp.com/')) {
            message.delete()
            .then(message.channel.send('<@!' + message.member + '>' + config.link_deleted_chat_message))
            .then(message.member.send('<@!' + message.member + '>' + config.link_deleted_dm_message))
        }
        else if (message.content.includes('https:')) {
            message.delete()
            .then(message.channel.send('<@!' + message.member + '>' + config.link_deleted_chat_message))
            .then(message.member.send('<@!' + message.member + '>' + config.link_deleted_dm_message))
        }
        else if (message.content.includes('http:')) {
            message.delete()
            .then(message.channel.send('<@!' + message.member + '>' + config.link_deleted_chat_message))
            .then(message.member.send('<@!' + message.member + '>' + config.link_deleted_dm_message))
        }
        else if (message.content.includes('www.')) {
            message.delete()
            .then(message.channel.send('<@!' + message.member + '>' + config.link_deleted_chat_message))
            .then(message.member.send('<@!' + message.member + '>' + config.link_deleted_dm_message))
        }
    }
})

但是,當我向頻道發送鏈接時,機器人會刪除該鏈接,然后崩潰。

錯誤:

C:\Users\knock\OneDrive\Desktop\Frreiheit\main.js:61
    if(!message.member.roles.cache.has('835605932317868042')) {
                       ^

TypeError: Cannot read property 'roles' of null
    at Client.<anonymous> (C:\Users\knock\OneDrive\Desktop\Frreiheit\main.js:61:24)
    at Client.emit (events.js:327:22)
    at MessageCreateAction.handle (C:\Users\knock\OneDrive\Desktop\Frreiheit\node_modules\discord.js\src\client\actions\MessageCreate.js:31:14)
    at Object.module.exports [as MESSAGE_CREATE] (C:\Users\knock\OneDrive\Desktop\Frreiheit\node_modules\discord.js\src\client\websocket\handlers\MESSAGE_CREATE.js:4:32)
    at WebSocketManager.handlePacket (C:\Users\knock\OneDrive\Desktop\Frreiheit\node_modules\discord.js\src\client\websocket\WebSocketManager.js:384:31)
    at WebSocketShard.onPacket (C:\Users\knock\OneDrive\Desktop\Frreiheit\node_modules\discord.js\src\client\websocket\WebSocketShard.js:444:22)
    at WebSocketShard.onMessage (C:\Users\knock\OneDrive\Desktop\Frreiheit\node_modules\discord.js\src\client\websocket\WebSocketShard.js:301:10)
    at WebSocket.onMessage (C:\Users\knock\OneDrive\Desktop\Frreiheit\node_modules\ws\lib\event-target.js:132:16)
    at WebSocket.emit (events.js:315:20)
    at Receiver.receiverOnMessage (C:\Users\knock\OneDrive\Desktop\Frreiheit\node_modules\ws\lib\websocket.js:835:20)

這可能是因為您在刪除頻道后向頻道發送消息。 也許它返回成員為 null 因為你是一個機器人。 只需做一個簡單的檢查,如果消息不是來自您或機器人來查看,是否是問題所在。

在某些情況下,message.member 可以是 null。 從文檔中:

將消息的作者表示為公會成員。 僅當消息來自作者仍然是成員的公會時才可用

來源: https://discord.js.org/#/docs/main/stable/class/Message?scrollTo=member

因此,很可能一條消息是從不被視為成員的作者發送的。

正如 Veda 所說,如果消息不是在公會中發送的,則message.member將為null 您可以簡單地檢查message.member是否存在,然后再查看它的角色:

if (message.member && !message.member.roles.cache.has(...))

正如我在評論中提到的,在解決了這個問題之后,你的機器人仍然無法工作,因為你濫用了 promises 例如:

message
 .delete()
 .then(message.channel.send('...'))
 .then(message.member.send('...'));

// should be:
message
 .delete()
 .then(() => message.channel.send('...'))
 .then(() => message.member.send('...'));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM