fs.write & read не обновляется - PullRequest
       25

fs.write & read не обновляется

0 голосов
/ 28 января 2019

В основном мой код здесь говорит о том, что если пользователь отправляет сообщение !submit ___, то файл leaderboard.json увеличит их счет на единицу.
Это все работает отлично, однако, например, их количество изменяется от 0 до1, в следующий раз, когда тот же человек отправит !submit, их счет должен увеличиться с 1 до 2 без необходимости перезапуска сценария каждый раз.К сожалению, этого не происходит ... Я отправляю !submit, и мой счетчик меняется с 0 на 1, но затем я отправляю его снова, и он остается с 0 до 1.

Leaderboard.json:

{
    "usercount<@386679122614681600>": 0
}

index.js:

client.on('message', msg => {
   if (msg.content.startsWith("!submit ")){
      var shoe = msg.content.substr("!submit ".length);

      var fs = require('fs')
      fs.readFile('leaderboard.json', 'utf8', function (err,data) {
        if (err) {
          return console.log(err);
        }
        var user = msg.member;
        var usercount = 'usercount'+user
        var username = 'usercount'+user

        var LEADERBOARD = require('./leaderboard.json');
        var countvalue = LEADERBOARD[username]
        var countvalue2 = countvalue+1
        var replacetext = ('"'+usercount+'": '+countvalue).toString()
        var newtext = ('"'+usercount+'": '+(countvalue2)).toString()

        fs.writeFile('leaderboard.json', data.replace(replacetext, newtext), 
        'utf8', function () {
            if (err) return console.log(err);
        });
        console.log('NEW SUBMISSION: '+replacetext+' >>>> '+newtext)

     });
   }

Вот как выглядит моя консоль после отправки! Дважды отправьте:

image

Когда технически вторая строка должна переходить с 1 на 2, без необходимости закрывать и перезапускать скрипт.

Я знаю, что это может показатьсянемного сложно, но любая помощь будет оценена!

1 Ответ

0 голосов
/ 28 января 2019

Вот что я бы посоветовал:

const fs = require('fs')

client.on('message', msg => {
    if (msg.content.startsWith("!submit ")) {
        let shoe = msg.content.substr("!submit ".length);

        // read leaderboard file and parse the JSON into a Javascript object
        fs.readFile('leaderboard.json', 'utf8', function(err, data) {
            if (err) {
                console.log("Error reading leaderboard.json", err);
                return;
            }

            let leaderboard;
            try {
                leaderboard = JSON.parse(data);
            } catch(err) {
                console.log("Error parsing leaderboard JSON", err);
                return;
            }

            const user = msg.member;
            const username = 'usercount' + user;

            // make sure there's a count for this username
            let cnt = leaderboard[username];
            if (!cnt) {
                cnt = 0;
            }
            // increment the cnt
            ++cnt;

            // set the new count
            leaderboard[username] = cnt;

            // now write the data back to the file
            fs.writeFile('leaderboard.json', JSON.stringify(leaderboard), 'utf8', function() {
                if (err) {
                    console.log(err);
                    return;
                }
                console.log(`New Submission for ${username}, cnt = ${cnt}`);
            });
        });
    }
});

Сводка изменений:

  1. Читает leaderboard.json только один раз, используя fs.readFile()
  2. Послечитая данные, он преобразует их в JSON, используя JSON.parse().
  3. Инициализирует пользователя cnt, если его еще нет в файле
  4. Обновляет cnt непосредственно в объекте Javsacript
  5. Записываетизмененный объект, используя JSON.stringify() для преобразования объекта обратно в JSON
  6. Помещает новое сообщение консоли отправки в fs.writeFile() обработчик успеха
  7. Переключитесь на const и let с var

Проблемы, которые еще не включены:

  1. Проблемы параллелизма, если несколько событий message могут быть "в полете" одновременно и конфликтовать.
  2. Ещеполная обработка ошибок, кроме простой остановки обработки в случае ошибки (я не уверен, что ваше приложение должно делать в этом случае, поскольку это зависит от приложения).
  3. Ваша переменная shoe нигде не используется, не уверен, что там делает.
...