Как сбросить файл, отредактированный с помощью edit-json-file - PullRequest
0 голосов
/ 05 июля 2018

Я работал над этой очередью для бота discord.js. Что он делает, кто-то делает! Smm submit, а затем он добавит его в файл JSON следующим образом:

"1": "id",
"2": "anotherid"

Тогда, если кто-то сделает! Smm delete, он удалит первый элемент в списке. По какой-то причине, если я сделаю это, он сохранит то же количество объектов, но вместо этого он будет дублировать последний объект, поэтому, если мой файл JSON был таким

"1": "id",
"2": "anotherid",
"3": "thisid"

Это было бы в конце

"1": "anotherid",
"2": "thisid",
"3": "thisid"

Если у вас есть лучший способ для очереди, пожалуйста, скажите мне иначе, вот мой код для команды и ее подкоманд. Установлен api editJsonFile, поэтому, когда вы видите «queue.set (« foo »,« foobar »)», «foo» - это имя объекта, а «foobar» - это значение объекта:

if(cmd === `${prefix}smm`){
    let type = args[0];
    let a = args[1];
    if(type === "submit"){
        message.delete()
        if(a){
            if(a.charAt(4) === "-" && a.charAt(9) === "-" && a.charAt(14) === "-"){
                for(x = 1; x < 10000; x++){
                    if(!file[x]){
                        console.log(x)
                        queue.set(`${x}`, `${a}`)
                        return;
                    }
                }
            }else{
                message.author.send("Sorry but you typed in the ID wrong. Make sure you include these '-' to separate it.")
            }
        }
    }
    if(type === "delete"){
        message.delete()
        let arr = [];
        for(x = 1; x < 10000; x++){
            if(file[x]){
                arr.push(file[x])
            }else{

                let arrr = arr.slice(1)
                console.log(arrr)
                fs.writeFile(`./queue.json`, '{\n    \n}', (err) => {
                    if (err) {
                        console.error(err);
                        return;
                    };
                });
                setTimeout(function(){

                    console.log(arrr.length)
                    for(e = 0; e < arrr.length; e++){
                        console.log(`e: ${e} || arrr.length: ${arrr.length}`)
                        queue.set(`${e+1}`, `${arrr[e]}`)
                    }

                    return;
                }, 3000)
                return;
            }
        }

    }
}

1 Ответ

0 голосов
/ 08 июля 2018

Мне кажется, я выяснил вашу проблему: в строке 32 вы «сбрасываете» файл с помощью fs.writeFile. Поскольку файл кэшируется с помощью editJsonFile , перезапись файла не влияет на переменную очереди, и когда вы устанавливаете другое значение, пакет внутренне перезаписывает ранее кэшированные значения.

Чтобы избежать этого, вы можете сбросить переменную после вызова fs.writeFile() (или fs.writeFileSync()). Вот небольшой пример, который я протестировал с RunKit :

var editJsonFile = require("edit-json-file");
var fs = require("fs");

var file = editJsonFile(`./queue.json`); //load queue.json

file.set("1", "foo"); //set your values
file.set("2", "bar");

console.log(file.get()); //this logs "{1: "foo", 2: "bar"}"

fs.writeFileSync(`./queue.json`, '{\n    \n}'); //reset queue.json

file = editJsonFile(`./queue.json`); //reload the file <---- this is the most important one

file.set("3", "test"); //set your new variables

console.log(file.get()); //this logs "{3: "test"}"
...