discord. js Ошибка команды unban, когда не дан идентификатор для unban - PullRequest
0 голосов
/ 28 апреля 2020

Я следил за этим диссонансом. js Учебное пособие по ботам ser ie, и я обнаружил ошибку, которую не могу решить. Команда работает, когда вы даете ей идентификатор, но когда вы ничего не даете, она не показывает строку ошибки, она должна показывать, что выдает ошибку в консоли.

Это код без некоторых ненужные строки или те, которые работают:

const Discord = require("discord.js");
const botconfig = require("../botconfig.json");
const colours = require("../colours.json");


module.exports.run = async (bot, message, args) => { 

    if(!message.member.hasPermission(["BAN_MEMBERS", "ADMINISTRATOR"])) return message.channel.send("...")

    let bannedMember = await bot.users.fetch(args[0])       //I believe the error is somewhere in this line maybe because of the promise
    if(!bannedMember) return message.channel.send("I need an ID")

    let reason = args.slice(1).join(" ")
    if(!reason) reason = "..."


    try {
        message.guild.members.unban(bannedMember, {reason: reason})
        message.channel.send(`${bannedMember.tag} ha sido readmitido.`)
    } catch(e) {
        console.log(e.message)
    }


}

И это ошибка:

(node:19648) UnhandledPromiseRejectionWarning: DiscordAPIError: 404: Not Found
    at RequestHandler.execute (C:\Users\Anton\Desktop\Bob\node_modules\discord.js\src\rest\RequestHandler.js:170:25)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
(node:19648) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was 
not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:19648) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Кроме того, когда вы даете ему что-то, что не является идентификатором, подобным ! unban asdf У меня есть эта ошибка:

(node:17824) UnhandledPromiseRejectionWarning: DiscordAPIError: Invalid Form Body
user_id: Value "asdf" is not snowflake.
    at RequestHandler.execute (C:\Users\Anton\Desktop\Bob\node_modules\discord.js\src\rest\RequestHandler.js:170:25)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:17824) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Я не знаю, что не так с первой ошибкой, и для второй ошибки, я думаю, мне просто нужно проверить, является ли args[0] id или снежинка , но я не знаю как.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Мне удалось найти правильное решение для того, что я хотел сделать, но сначала я хочу прокомментировать несколько вещей: как сказал 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 и возвращает сообщение об ошибке.

0 голосов
/ 28 апреля 2020

Для первой ошибки я бы просто проверил, задано ли args [0] или нет. Я предполагаю, что bot.users.fetch возвращает объект ошибки, поэтому !!bannedMember будет оцениваться как истина. Вы используете Discord. js v12? Это отличается в v11 и v12, поэтому я не могу дать вам четкий ответ на этот вопрос прямо сейчас. Если вы хотите проверить, что он возвращает, вы можете просто console.log забанить члена tho.

Так что мое предложение:

if(!args[0]) return message.channel.send("please provide a valid ID");

Также это был бы полный действительный подход к позвольте приведенному ниже коду работать, чтобы поймать ваш второй тип ошибки

    try {
        message.guild.members.unban(bannedMember, { reason });
        message.channel.send(`${bannedMember.tag} ha sido readmitido.`);
    } catch(e if e instanceof DiscordAPIError) {
        message.channel.send("Are you sure this is a valid user ID?");
    }
...