TypeError: Cannot read property 'user' of undefined error while trying to make a command

TypeError: Cannot read property 'user' of undefined error while trying to make a command

我试图发出一个命令,每次命令是 运行 时 ping 一个随机用户,但我似乎 运行 遇到了问题。

这是我的代码:

const DiscordCommand = require('../../contracts/DiscordCommand');
class KickCommand extends DiscordCommand {
  onCommand(message) {
    message.delete();
    const userList = message.guild.members.cache.array();
    var randomNumber = Math.round(Math.random() * message.guild.memberCount);
    var pingPerson = userList[randomNumber];
    message.channel.send('<@' + pingPerson.user.id + '>').then((msg) => {
      msg.delete({ timeout: 100 });
    });
  }
}

module.exports = KickCommand;

我得到的错误:

TypeError: Cannot read property 'user' of undefined

问题是 Math.round(Math.random() * message.guild.memberCount) 可以 return 大于上一个索引的数字,因为你使用 round() instead of floor()

但是;您可以使用 Collection#random() 从集合中获取唯一的随机值,而不是创建随机生成器函数。

message.guild.members.cache return是一个集合,所以你可以这样使用它:

class KickCommand extends DiscordCommand {
  onCommand(message) {
    message.delete();
    const pingPerson = message.guild.members.cache.random();
    message.channel.send('<@' + pingPerson.user.id + '>').then((msg) => {
      msg.delete({ timeout: 100 });
    });
  }
}

首先 fetch 用户可能也是个好主意:

class KickCommand extends DiscordCommand {
  async onCommand(message) {
    message.delete();
    await message.guild.members.fetch();
    
    const pingPerson = message.guild.members.cache.random();
    const msg = await message.channel.send('<@' + pingPerson.user.id + '>');

    // msg.delete() doesn't take any parameters in v13, so use setTimeout instead
    setTimeout(() => msg.delete(), 100);
  }
}

并确保 GUILD_MEMBERS 意图已启用。