简体   繁体   中英

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

I am currently trying to code a linkblocker in discord.js. The link should only be deleted if you are not in the group with the correct ID.

My code:

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))
        }
    }
})

However, when I send a link to a channel, the bot deletes the link, but then crashes.

Error:

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)

That's probably because you are sending a message to the channel after you have deleted it. Maybe it returns member as null because of you being a bot. Just do a simple check, if the message is not coming from you or a bot to see, if that is the problem.

message.member can be null in some cases. From the documentation:

Represents the author of the message as a guild member. Only available if the message comes from a guild where the author is still a member

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

So probably a message is sent from an author that is not considered a member.

As Veda said, message.member will be null if the message was not sent in a guild. You can simply check if message.member exists before looking at it's roles:

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

As I mentioned in my comment, after fixing this issue, your bot still won't work because you're misusing promises . For example:

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM