【问题标题】:Cannot read property 'roles' of null无法读取 null 的属性“角色”
【发布时间】:2020-05-27 09:20:59
【问题描述】:

我希望我的机器人向加入我的服务器的用户发送私人消息。

为此,我使用了:

 client.on('guildMemberAdd', member => {
   const channel = member.guild.channels.find(ch => ch.name === 'benvenuto');
  channel.send(`Date il benvenuto a ${member}!`);
  member.send('test');
});

一旦用户加入服务器,我就会收到此错误:

TypeError: Cannot read property 'roles' of null
    at Client.client.on.message (C:\Users\Kikkiu\Desktop\BotTuttofare\index.js:9:19)
    [...]

错误将我带到这部分代码:

if(message.member.roles.find(r => r.name === "Admin") || message.member.roles.find(r => r.name === "Mod")) {
  if(!message.author.bot) {

  if(message.content == '.del50')
  message.channel.bulkDelete(50)

  if(message.content == '.del100')
  message.channel.bulkDelete(100)

  if(message.content == '.del1')
  message.channel.bulkDelete(2)

  if(message.content == '.del10')
  message.channel.bulkDelete(10)

  if(message.content == '.del2')
  message.channel.bulkDelete(3)
}}

如果我删除发送私人消息的部分,我不会收到此错误。会是什么?

【问题讨论】:

  • 这意味着message.membernull 在这部分代码之前发生了一些事情。
  • 其实之前并没有太多的事情发生。事实是,当我使用命令.del100(或当我删除发送消息的部分时)它起作用时,我没有收到此错误。我也在另一个机器人中使用了if(message.member.roles.find(r => r.name === "Admin") || message.member.roles.find(r => r.name === "Mod")) {,它工作得很好。
  • Message.member 仅在消息来自公会时可用。机器人是否有可能收到直接消息?无论如何,您需要先验证成员并确保它不为空,然后再对其进行操作。
  • 不,机器人没有收到任何直接消息。为了检查成员不为空,我使用了client.on('message', message => { if(message.member) { console.log('test') }} 成员不为空。我也使用了if(message.member.roles) {,结果相同。但是,一旦用户加入服务器,就会出现上述错误。 (我忘了提到机器人成功地向用户发送了私人消息,但由于上面的错误而崩溃)

标签: javascript node.js discord.js roles


【解决方案1】:

我认为您找不到这样的成员角色。 你在公会上使用.find() (member.guild.roles.find(r => r.name == "Admin"))

如果你想检查他们是否获得了正确的角色,这样的事情应该可以工作:

let adminRole = message.guild.roles.get("ADMIN_ROLE_ID") //same with mod role
if (message.member.roles.has(adminRole.id)) {
//If they have admin & mod role they can do this
} else {
//If they do not have the one of the roles, this happens. Either just do return; or do //something like dm them that they don't have roles/permissions
}

但我确实建议您为此设置一个单独的逗号,您可以使用 args 或其他东西来定义您想要在频道中批量处理多少,这只是令人困惑。

【讨论】:

    猜你喜欢
    • 2022-07-24
    • 2022-01-14
    • 2021-02-26
    • 1970-01-01
    • 2021-03-02
    • 2021-07-18
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    相关资源
    最近更新 更多