首页 > 解决方案 > .db 和 Promises 的问题

问题描述

所以我正在研究这个小型的不和谐机器人,我现在正在研究的部分是让机器人能够跟踪用户发送了多少条消息,并能够在出现提示时吐出该数量。这第一块代码来自主文件

const client = new Discord.Client();
const prefix = "!"; //Our bot's prefix
const fs = require('fs'); 
const db = require('quick.db'); //Database to track user message counts

client.on('ready', () => {
    console.log('Logged in and ready to socially distance!')
});

//This will run everytime a message is recieved
client.on('message', message => {

    let args = message.content.slice(prefix.length).trim().split(" ");
    let cmd = args.shift().toLowerCase();

    try { //This is allow bot commands to be placed in seperate files, so no need for constant if-else statements
        let commandFile = require(`./commands/${cmd}.js`);
        commandFile.run(client, message, args);
    } catch(e) {

        console.log(e.message);

    } finally {

        console.log(`${message.author.username} ran the command: ${cmd}`);
    }

    if (!message.content.startsWith(prefix)) return; //Ignores a message if it doesn't start with our prefix

    //Message Tracking/Leveling 
    db.add(message.author.id + message.guild.id, 1).then(i => {

        let messages; 
        if (i.value == 25) messages = 25; //This will be Level 1
        else if (i.value == 50) messages = 50; //This will be Level 2
        else if (i.value == 100) messages = 100; //This will be Level 3 

        if (!isNaN(messages)) { //If messages empty this runs
            db.add(`userLevel_${message.author.id + message.guild.id}`, 1)
            .then(o =>  {
                message.channel.send(`You sent ${messages} messages, so you leveled up! You are now level ${o.value}`); //Sends updated level to the channel
            }) 
            .catch(ex); {
                message.channel.send("Sorry, can't do that.")
            }

        }
    }) 

}); 


client.login('TOKEN-ID');

代码的下一部分是一个单独的文件


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

    db.get(message.author.id + message.guild.id)
    .then(i => { //Messages sent
        db.get(`userLevel_${message.author.id + message.guild.id}`)
        .then(o => { //Their level
            message.channel.send('Messages sent: `' + (i.value + 1) + '`\nLevel: `' + o.value + '`'); //Returns messages and level
        } 
    ).catch(ex); {
        message.channel.send("Sorry, can't do that.")
    }

})}

最后这是错误

                                                    ^
TypeError: db.add(...).then is not a function

标签: javascriptnode.js

解决方案


因此,quick.db 文档 db.add()不会返回承诺,因此您不能将回调附加到它。该过程是同步管理的:

db.add(message.author.id + message.guild.id, 1)
// Continue your code here and the previous line is garantized to be finished already

对于db.get()和所有操作相同quick.db。它们是同步的。


推荐阅读