Discord.js 使用 quick.db 的 V12 黑名单命令无效

Discord.js V12 blacklist command using quick.db isn't working

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

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] 是什么?根据您的用法,第一个参数只是要列入黑名单的用户的 ID。所以args[0]用户的ID,一些String形式: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的情况。

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