Возникли проблемы с записью в JSON-файл после его прочтения (discord.js )

#javascript #node.js #discord.js

#javascript #node.js #discord.js

Вопрос:

Я работал над проектом для сервера discord моего друга, где я хочу сохранить что-то вроде «базы данных» о наших участниках, например, количество предупреждений (или забастовок), их возраст (потому что у нас были проблемы с несовершеннолетними участниками) и некоторые заметки. Я использую учебные пособия, поскольку я довольно новичок в javascript и действительно новичок в Discord.js так что я пока не совсем уверен в том, что я делаю.

(чтобы уточнить, я не получаю никаких ошибок, он просто не обновляется до нового файла)

Вот ресурсы, которые я использовал:

https://www.youtube.com/watch?v=JB1rWJRafRA

https://discordjs.guide/popular-topics/collectors.html#message-collectors

https://www.youtube.com/watch?v=J2bKyv5pp-M

И мой код: (заранее извините, это действительно грязно)

 const Discord = require('discord.js');
const fs = require('fs');
const jsonfile = require('jsonfile');
const Client = new Discord.Client();

var data = {}; //start of member activeness tracker
if (fs.existsSync('data.json')) {
    data = jsonfile.readFileSync('data.json');
}

console.log("Bot Starting...");

Client.on("ready", () => console.log('ServerMgr is ready!  Now managing servers!'));  //bot init complete

Client.on("message", (message) =>  {

    if (message.guild.id in data === false) {data[message.guild.id] = {} } //if new guild

    const guildData = data[message.guild.id];

    if (message.author.id in guildData === false) {
        guildData[message.author.id] = {
            username: message.author.username,
            message_count: 0,
            last_message: 0,
            age: 0,
            times_left: 0,
            strikes: 0,
            notes: ""
         }
    }

    const userData = guildData[message.author.id];
    userData.message_count   
    userData.last_message = Date.now();

    jsonfile.writeFileSync('data.json', data)

    const parts = message.content.split(' ') 
    if(parts[0] === ';ping') {message.reply('```SeverMgr is online!nCurrent Ping: '   (Math.abs(Date.now() - message.createdTimestamp))/ 100   " ms```")}
    if(parts[0] === ';read') {
        if (message.mentions.members.first()) {
            var user = message.mentions.users.first()
            const id = user.id
            const userData = guildData[id]
            const lastMessage = new Date(userData.last_message)
            message.channel.send("Getting data for "   user.username   "#"   user.discriminator   "...")
            message.channel.send("Sent "   userData.message_count   " messagesn"   
            "Last message was sent at: "   lastMessage   "n"  
            "Age: "   userData.age   "n"   
            "Times user left server: "   userData.times_left   "n"  
            "Strikes: "   userData.strikes   "n"   
            userData.notes);

        } else {
        message.reply("You need to mention a user to get their data!");
        }
    }

    if(parts[0] === ';write') {
        if (message.mentions.members.first()) {

            var user = message.mentions.users.first();
            const id = user.id;
            const userData = guildData[id];

            message.channel.send("What data point do you want to edit? n Accepted responses are: n `message count` n `age` n `times left` n `strikes` n `notes` ")
            let filter = m => m.content.includes('message count' || 'age' || 'times left' || 'strikes' || 'notes') amp;amp; !m.author.bot ;
            let collector = new Discord.MessageCollector(message.channel, filter);

    collector.on('collect', (m,col) => {
        var res = "";
        let mess = m.content;
        console.log(mess);
        if (mess == ("message count")) {res = 'message_count' } 
        if (mess == ("age")) {res = 'age' }
        if (mess == ("times left")) {res = 'times_left' }
        if (mess == ("strikes")) {res = 'strikes' }
        if (mess == ("notes")) {res = 'notes' }
        console.log(res);
        message.channel.send("Editing "   res   "n The current value is:");

        if (res == "message count") {message.channel.send(userData.message_count) } 
        if (res == "age") {message.channel.send(userData.age)}
        if (res == "times left") {message.channel.send(userData.times_left)}
        if (res == "strikes") {message.channel.send(userData.strikes)}
        if (res == "notes") {message.channel.send(userData.notes)}

        collector.stop();
        message.channel.send("The value currently located inside of "   res   " will be overwritten, so if you want to edit the content directly, copy the message above, and paste it into the send box.");
        let filter = m => !m.author.bot;
        let collector2 = new Discord.MessageCollector(message.channel, filter);
    });

    collector2.on('collect', m => {
        var mess = m.content;
        if (res === "message count") {userData.message_count = mess } 
        if (res == "age") {userData.age = mess}
        if (res == "times left") {userData.times_left = mess}
        if (res == "strikes") {userData.strikes = mess}
        if (res == "notes") {userData.notes = mess}
        message.channel.send("Data saved!");
        console.log("Saving "   mess);
    
        var guildData = data[message.guild.id];
        var userData = guildData[message.author.id];
        var pointData = userData[res];
        console.log("old data");
        console.log(pointData);
        pointData = mess;
        console.log("new data");
        console.log(pointData);
        jsonfile.writeFileSync('data.json', data) //HERE IS THE ISSUE
        collector2.stop();
    });

    } else {
        message.reply("You need to mention a user to edit their data!");
    }
}
});

Client.login('TOKEN');
 

Данные хранятся как таковые:

 '779904676879007744': {
    username: 'SeverMgr',
    message_count: 129,
    last_message: 1606028233445,
    age: 0,
    times_left: 0,
    strikes: 0,
    notes: ''
 

Спасибо за любую помощь!

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

1. Можете ли вы указать, какие проблемы у вас возникли с JSON? Есть сообщения об ошибках?

2. О чем говорит ошибка?

3. Я не получил никаких ошибок, это просто не обновление файла.

4. Выполняется ли блок кода? Вы видите консоль? журнал выше?

5. Да, вся консоль. журналы отображаются в журнале.

Ответ №1:

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

 var x = 1
var y = x
var y = 2
---
x will still be 1
y will be 2
 

Итак, в вашем случае вы могли бы сделать это, чтобы обновить переменную данных

 data[message.guild.id][message.author.id][res] = mess
 

Вместо этого, поскольку вы обновляете копии, а не данные напрямую.

 var guildData = data[message.guild.id]
var userData = guildData[message.author.id]
var pointData = userData[res]
pointData = mess