[英]Discord.js: Linkblocker TypeError: Cannot read property 'roles' of null
I am currently trying to code a linkblocker in discord.js.我目前正在尝试在 discord.js 中编写链接阻止程序。 The link should only be deleted if you are not in the group with the correct ID.仅当您不在具有正确 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.也许它返回成员为 null 因为你是一个机器人。 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.在某些情况下,message.member 可以是 null。 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来源: 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.正如 Veda 所说,如果消息不是在公会中发送的,则message.member
将为null
。 You can simply check if message.member
exists before looking at it's roles:您可以简单地检查message.member
是否存在,然后再查看它的角色:
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 .正如我在评论中提到的,在解决了这个问题之后,你的机器人仍然无法工作,因为你滥用了 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('...'));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.