Как вы храните данные, чтобы при перезапуске бота они не сбрасывались

#javascript #discord #bots #discord.js

#javascript #Discord #боты #discord.js

Вопрос:

Я работаю над командой экономии, но каждый раз, когда я перезапускаю бота, он сбрасывает баланс. Я не знаю, как хранить данные, поэтому вы можете мне помочь

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

Вот мой код:

 const Discord = require('discord.js');
const fs = require("fs");
bot.on('message', async message => {
    if (message.content.startsWith("!bal")) {
        let user = message.mentions.users.first() || message.author
        let money = db.fetch(`money_${user.id}`)
        if (money === null) money = 0

        message.channel.send(`${user} you have ${money} coins`)
    }
    let timeout = 86400000
    let amount = 1000
    if (message.content === "!daily") {
        let daily = await db.fetch(`daily_${message.author.id}`);
        if (daily != null amp;amp; timeout - (Date.now() - daily) > 0) {
            let time = ss(timeout - (Date.now() - daily));
            message.channel.send(`You already collected your daily reward, you can come back in **${time.hours}h ${time.minutes}m ${time.seconds}s**`)
        }else {
            embed = new Discord.MessageEmbed()
            .setAuthor(`Daily`, message.author.displayAvatarURL)
            .setColor("GREEN")
            .setDescription(`**Daily Rewards**`)
            .addField('Collected', amount)
            message.channel.send(embed)
            db.add(`money_${message.author.id}`, amount)
            db.add(`daily_${message.author.id}`, Date.now())
        }
    }
    let timeoutworked = 3600000
    let worked = await db.fetch(`worked_${message.author.id}`)
    if (message.content === "!work"){
        if (worked != null amp;amp; timeoutworked - (Date.now() - worked) > 0) {
            let time = ss(timeout - (Date.now() - worked));
            message.channel.send(`You have already worked, please come back in **${time.hours} ${time.minutes}m ${time.seconds}s**`)
    }else{
        let amountearned = Math.floor(Math.random() * 1000)   1
        let jobs = ["Developer", "Chef", "Doctor", "Cashier"]
        let job = jobs[Math.floor(Math.random() * jobs.length)]

        let embed = new Discord.MessageEmbed()
        .setAuthor(`${message.author.tag}, it payed off`, message.author.displayAvatarURL())
        .setDescription(`${message.author.tag}, you worked as a ${job} and earned ${amountearned} coins`)
        message.channel.send(embed)
        db.add(`money_${message.author.id}`, amountearned)
        db.set(`worked_${message.author.id}`, Date.now())
    }
}})
  

Также я использую Heroku для размещения своего бота

Ответ №1:

вы можете использовать локальное хранилище для хранения данных в браузере

 //Store data in LocalStorage
localStorage.setItem("title", "Hello World");             // (Key / Value)

//Get data
console.log(localStorage.getItem("title"));

//Set Objects
var user= {
    nombre: "Ava",
    apellido: "Lovelace",
    edad: 28
};
localStorage.setItem("user", JSON.stringify(user));     // (Key / Value)

//Get Objeto
var userJS = JSON.parse(localStorage.getItem("user"));
console.log(userJS);

//Remove item
localStorage.removeItem("user");

//Clean all localStorage
localStorage.clear();  

Помните, что вы можете хранить только строковый тип данных в localStorage, поэтому вы можете использовать JSON.stringify (obj) для преобразования объекта в строку и JSON.parse (str) для преобразования строки json в объект.

Ответ №2:

Похоже, что принудительное обновление базы данных включено, т. Е. удаляйте все существующие таблицы и создавайте новые таблицы при каждой перезагрузке бота. Проверьте код, в котором вы определяете схему и создаете базу данных.

Например, в sequelize вы делаете следующее, чтобы определить схему и создать таблицу:

 var User = sequelize.define('user',{
    // schema
});

User.sync({force: true}); // creating the table
  

Обратите внимание, как {force: true} передается при создании таблицы. Это говорит sequelize удалять существующие таблицы с таким именем и создавать новые при каждом выполнении этого кода.

Я использовал sequelize в качестве примера отчасти потому, что вы не упомянули, какую базу данных вы используете, а отчасти потому, что я использую sequelize. Проверьте наличие любой документации по такому поведению в используемой вами базе данных.

Редактировать:

Quick.db — это постоянная база данных, и я не нашел никаких доказательств принудительного обновления базы данных при каждом запуске кода. Во что бы то ни стало, он должен быть постоянным.

Таким образом, проблема, вероятно, в эфемерной файловой системе heroku. Они прямо предлагают не использовать файловые базы данных, такие как sqlite3 здесь и здесь. По-видимому, каждые 24 часа или около того все файлы в каталоге проекта заменяются файлами из последнего развертывания.

Решение заключается в использовании дополнения postgresql, которое является бесплатным для ограниченного использования.

Это все, что я смог найти. Надеюсь, это поможет.

Комментарии:

1. Я использую quick.db, пожалуйста, помогите