Мне удалось найти правильное решение для того, что я хотел сделать, но сначала я хочу прокомментировать несколько вещей: как сказал Zer0, если bannedMember = await bot.users.fetch(args[0])
возвращает ошибку, и мы проверяем ее с if(!bannedMember)
, она будет быть похожим на !!bannedMember
, превращая его в истинный оператор, но у нас есть это определение для условного оператора if :
Используйте , если , чтобы указать блок кода, который должен быть выполнен, если указанное условие true .
Именно поэтому мы используем if(!condition)
, чтобы проверить, было ли условие ложным.
Но проблема была не в этом. Проблема заключалась в том, что функция await блокирует функцию asyn c. Это означает, что если обещание , которое оно ожидает, не прибудет при вызове, и оно придет с ошибкой, которая была у меня без продолжения работы с остальным кодом. Вот где приходит решение, которое дал мне друг, и которое я в итоге использовал, и оно отлично работает:
module.exports.run = async (bot, message, args) => {
if(!message.member.hasPermission(["BAN_MEMBERS", "ADMINISTRATOR"])) return message.channel.send("You can't do that.")
if(!args[0]) return message.channel.send("Give me a valid ID");
//This if() checks if we typed anything after "!unban"
let bannedMember;
//This try...catch solves the problem with the await
try{
bannedMember = await bot.users.fetch(args[0])
}catch(e){
if(!bannedMember) return message.channel.send("That's not a valid ID")
}
//Check if the user is not banned
try {
await message.guild.fetchBan(args[0])
} catch(e){
message.channel.send('This user is not banned.');
return;
}
let reason = args.slice(1).join(" ")
if(!reason) reason = "..."
if(!message.guild.me.hasPermission(["BAN_MEMBERS", "ADMINISTRATOR"])) return message.channel.send("I can't do that")
message.delete()
try {
message.guild.members.unban(bannedMember, {reason: reason})
message.channel.send(`${bannedMember.tag} was readmitted.`)
} catch(e) {
console.log(e.message)
}
}
Я использую предложение Zer0 if(!args[0]) return message.channel.send("Give me a valid ID");
, чтобы проверить, было ли что-то напечатано после команды ! Unban устранение первой ошибки. Чтобы устранить вторую ошибку и проверить, получили ли мы действительный идентификатор, у нас есть первый try ... catch , где мы можем пройти через try , только если мы получим действительный идентификатор из-за this:
- .users : Все объекты User, которые были кэшированы в любой точке, отображаются по их идентификаторам.
- .fetch () : выбирает этого пользователя. Возвращает: Promise <Пользователь>.
Если try не удается, catch запускает , если , чтобы проверить, является ли bannedMember
false и возвращает сообщение об ошибке.