使用 quick.db 的 Discord.js V12 黑名单命令不起作用

问题描述

我正在尝试制作一个黑名单命令,该命令不允许任何使用命令的人使用它们并发送“您已被列入黑名单”,但是当有人使用该命令并将某人列入黑名单时,它不会记录任何错误,他们会仍然可以使用命令 我的代码有什么问题吗? 机器人主文件中的代码

client.on('message',message => {
    
    let user = db.get(`blacklist_${message.author.id}`);
    if(user == true) return message.channel.send('You are blacklisted!');

// rest of code

黑名单命令的代码

const discord = require('discord.js');
const db = require('quick.db')

module.exports = {
    name: 'blacklist',description: 'Blacklisting/unblacklisting a user',args: 'true',usage: '<user id>',execute(message,args,client) {
        
        if (message.member.roles.cache.find(r => r.id === '745415214199078942')) {
             let user = args[0];
             if (user === undefined) return message.channel.send('Invalid user or id')
             if(!user) return message.channel.send(`Invalid user or id`);
    
             let fetched = db.get(`blacklist_${user.id}`)
    
           if(!fetched) {
                 db.set(`blacklist_${user.id}`,true)
                 message.channel.send(`Blacklisted!`);
           }else{ 
                 db.delete(`blacklist_${user.id}`)
                 message.channel.send(`Unblacklisted!`);
                }
        } else {
            message.channel.send("You aren't a manager.")
        }
    }
}

解决方法

好吧,用户仍然可以使用这些命令的唯一原因是用户没有正确添加到数据库中,导致以下行是 false 而不是 true :

db.get(`blacklist_${message.author.id}`)

如果您的黑名单不起作用,那么该行必须始终是一个假值,例如 undefined。这意味着 blacklist_${message.author.id} 未在您的黑名单命令代码中正确设置为 true

那么让我们深入研究您的黑名单命令的代码,看看您将其设置为 true 的确切位置。这是您执行此操作的行:

db.set(`blacklist_${user.id}`,true)

好的,那里没有语法问题或拼写错误。所以这意味着,如果 blacklist_<user id> 即使在您执行上述行之后仍然是 undefined,那么 user.id 的值肯定是不正确的。因为如果 user.id 是正确的,那么显然 blacklist_<user id> 的值将是 true,如果是这样,他们会收到“你被列入黑名单”的消息并且无法使用命令.所以这意味着 user.id 的值不正确。

那么user.id的值究竟是什么?那么,user 的值是多少?这就是你定义的:

let user = args[0];

好的,那么 args[0] 是什么?根据您的用法,第一个 arg 只是要列入黑名单的用户的 ID。因此,args[0] 用户的 ID,形式为 12345678901234567 的一些字符串。因此,如果变量 user 本身已经代表用户的 ID,那么您为什么要使用 user.id?您的代码正在尝试执行类似 12345678901234567.id 的操作,而不仅仅是使用 ID 本身。

这就是您的代码出了什么问题的答案。 user.id 不存在,它是 undefined。您的 user 变量本身用户的 ID,因此您需要在黑名单命令的代码中使用 user 而不是 user.id。所以这就是固定版本的样子:

module.exports = {
    name: 'blacklist',description: 'Blacklisting/unblacklisting a user',args: 'true',usage: '<user id>',execute(message,args,client) {
        
        if (message.member.roles.cache.find(r => r.id === '745415214199078942')) {
             let user = args[0];
             if (!user) return message.channel.send('Invalid user or id');
    
             let fetched = db.get(`blacklist_${user}`)
    
           if (!fetched) {
                 db.set(`blacklist_${user}`,true)
                 message.channel.send(`Blacklisted!`);
           } else { 
                 db.delete(`blacklist_${user}`)
                 message.channel.send(`Unblacklisted!`);
           }
        } else {
            message.channel.send("You aren't a manager.")
        }
    }
}

我还删除了多余的行 if (user === undefined),因为 if (!user) 已经涵盖了用户为 undefined 的情况。

下次一定要自己完成调试过程,就像我上面详述的分步过程一样。当您在代码中发现问题时,逻辑地检查代码真的很有帮助,尤其是当它是这样的逻辑错误时(我的意思是代码实际上不会导致错误,但确实会给您一个结果你不是故意的)。