Discord.js:Linkblocker TypeError:无法读取 null 的属性“角色”

时间:2021-04-24 20:21:49

标签: javascript node.js discord.js

我目前正在尝试在 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)

3 个答案:

答案 0 :(得分:0)

这可能是因为您在删除频道后向该频道发送消息。也许它返回成员为 null 因为你是一个机器人。只需做一个简单的检查,如果消息不是来自您或机器人来查看,是否是问题所在。

答案 1 :(得分:0)

message.member 在某些情况下可以为 null。来自文档:

<块引用>

代表消息的作者作为公会成员。仅当消息来自作者仍然是成员的公会时可用

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

因此,很可能来自不被视为会员的作者发送的消息。

答案 2 :(得分:0)

正如吠陀所说,如果消息不是在公会中发送的,message.member 将是 null。您可以在查看其角色之前简单地检查 message.member 是否存在:

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

正如我在评论中提到的,在解决此问题后,您的机器人仍然无法工作,因为您是 misusing promises。例如:

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

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