discord.js unban 命令错误,当没有给 unban 一个 id 时

Posted

技术标签:

【中文标题】discord.js unban 命令错误,当没有给 unban 一个 id 时【英文标题】:discord.js unban command error when not given an id to unban 【发布时间】:2020-08-12 09:44:24 【问题描述】:

我一直在关注this discord.js bot tutorial serie,但发现了一个我无法解决的错误。该命令在您给它一个 id 时有效,但当您不给它任何东西时,它不会显示错误行,它应该在控制台中显示给我一个错误。

这是没有一些不必要的行或有效的代码:

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 这样的 id 的东西时,我有这个错误:

(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 还是 snowflake ,但我不知道怎么做。

【问题讨论】:

【参考方案1】:

对于第一个错误,我会检查是否给出了 args[0]。我假设bot.users.fetch 返回一个错误对象,因此!!bannedMember 将评估为真。你在使用 Discord.js v12 吗?这在 v11 和 v12 中有所不同,所以我现在不能给你一个明确的答案。如果你想检查它返回的内容,你可以 console.log 被禁止的成员。

所以我的建议是:

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?");
    

【讨论】:

我正在使用 v12,我尝试了 if(!args[0]),但它并没有说服我。我最终做了一个这样的尝试:let bannedMember; trybannedMember = await bot.users.fetch(args[0])catch(e)if(!bannedMember) return message.channel.send("...") 现在它工作正常。我正在尝试您的解决方案,但在catch(e if e instanceof DiscordAPIError) 某处出现“()”时出现错误。而且我没有想到!!bannedMember,所以我也会检查一下。非常感谢您的回答【参考方案2】:

我已经设法为我想做的事情提供了一个合适的解决方案,但首先我想评论几件事: 正如 Zer0 所说,如果 bannedMember = await bot.users.fetch(args[0]) 返回一个错误,我们用 if(!bannedMember) 检查它,就像 !!bannedMember 把它变成一个真实的语句,但是,我们对 if 条件语句有这个定义:

Use if to specify a block of code to be executed, if a specified condition is true.

这就是我们使用if(!condition)来检查条件是否为假的原因。

但这里的问题不在于。问题是 await 函数是块异步函数。这意味着如果它等待的 promise 在调用时没有到达,它会出现我遇到的错误,而无需继续执行其余代码。这是一位朋友给我的解决方案以及我最终使用的解决方案,并且效果很好:

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 解决第一个错误之后是否输入了某些内容。 为了解决第二个错误并检查我们是否得到了一个有效的 ID,我们有第一个 try...catch,如果我们得到一个有效的 ID,我们只能通过 try因为这个:

.users:所有在任何时候都被缓存的用户对象,由它们的 ID 映射。 .fetch():获取此用户。返回:Promise 。

如果 try 失败,catch 会运行 if 来检查 bannedMember 是否为 false 并返回消息错误。

【讨论】:

以上是关于discord.js unban 命令错误,当没有给 unban 一个 id 时的主要内容,如果未能解决你的问题,请参考以下文章

使用 discord.js v12 解禁命令

discord.js 没有发送到自定义频道

如何使用命令解禁用户?

解禁命令 |不和谐.js

TypeError:无法读取未定义的属性“hasPermission”

当机器人托管在 heroku 上时如何制作 discord.js 图像搜索命令