类型错误:尝试发出命令时无法读取未定义错误的属性'user'



我试图在每次运行命令时生成一个命令来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

问题是,当您使用round()而不是floor()时,Math.round(Math.random() * message.guild.memberCount)可以返回大于上一个索引的数字。

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

message.guild.members.cache返回一个集合,所以您可以这样使用它:

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意图已启用。

相关内容

最新更新