fs.write&阅读不更新

fs.write & read not updating

基本上,我这里的代码是说,如果用户发送一条消息 !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)

     });
   }

这是发送 !submit 两次后我的控制台的样子:

从技术上讲,第二行应该从 1 变为 2,而我不必关闭并重新启动脚本。

我知道这可能看起来有点复杂,但我们将不胜感激!

这是我的建议:

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. 使用fs.readFile()
  2. 仅读取一次leaderboard.json
  3. 读取数据后,它使用JSON.parse()将其转换为JSON。
  4. 初始化用户 cnt(如果不在文件中)
  5. 直接更新 Javsacript 对象中的 cnt
  6. 使用 JSON.stringify() 写出更改的对象,将对象转换回 JSON
  7. 将新的提交控制台消息放入 fs.writeFile() 成功处理程序
  8. var
  9. 切换到 constlet

尚未合并的问题:

  1. 如果多个 message 事件可以同时 "in-flight" 并发生冲突,则并发问题。
  2. 除了在出现错误时停止处理之外,还有更完整的错误处理(我不确定您的应用程序在这种情况下应该做什么,因为那是特定于应用程序的)。
  3. 您的 shoe 变量未在任何地方使用,不确定它在那里做什么。