Javascript 财政司司长;读不更新

Javascript 财政司司长;读不更新,javascript,node.js,discord,fs,discord.js,Javascript,Node.js,Discord,Fs,Discord.js,基本上,我这里的代码是说如果用户发送一条消息!提交uuuuu之后,文件leadboard.json将其计数增加一个。 这一切都很完美,但比如说,下次同一个人发送时,他们的计数从0变为1!提交,它们的计数应该从1变为2,而无需每次重新启动脚本。不幸的是,这并没有发生。。。我发送!提交,我的计数从0变为1,但我再次发送它,它保持从0变为1 leadboard.json: { "usercount<@386679122614681600>": 0 } client.on('mes

基本上,我这里的代码是说如果用户发送一条消息
!提交uuuuu
之后,文件
leadboard.json
将其计数增加一个。
这一切都很完美,但比如说,下次同一个人发送
时,他们的计数从0变为1!提交
,它们的计数应该从1变为2,而无需每次重新启动脚本。不幸的是,这并没有发生。。。我发送
!提交
,我的计数从0变为1,但我再次发送它,它保持从0变为1

leadboard.json:

{
    "usercount<@386679122614681600>": 0
}
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)

     });
   }
以下是发送后我的控制台的外观!提交两次:

{
    "usercount<@386679122614681600>": 0
}
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)

     });
   }

从技术上讲,第二行应该从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}`);
            });
        });
    }
});
更改摘要:

  • 使用
    fs.readFile()
  • 读取数据后,它使用
    JSON.parse()
    将其转换为JSON
  • 如果文件中没有用户cnt,则初始化用户cnt
  • 直接更新对象中的cnt
  • 使用
    JSON.stringify()
    写出已更改的对象,以将该对象转换回JSON
  • 将新提交控制台消息放入
    fs.writeFile()
    success处理程序
  • var
  • 尚未纳入的问题:

  • 如果多个
    消息
    事件可以同时“进行中”并发生冲突,则会出现并发问题
  • 除了在出现错误时停止处理之外,还有更完整的错误处理(我不确定您的应用程序在这种情况下应该做什么,因为这是特定于应用程序的)
  • 您的
    shoe
    变量没有在任何地方使用,不确定它在那里做什么

  • 为什么用
    fs.readFile()
    阅读
    leadboard.json
    ,然后用
    require('./leadboard.json')
    再次阅读。这毫无意义。只需使用
    require('./leadboard.json')
    (最好是一个异步执行该操作的库),修改对象,然后使用
    fs.writeFile()
    json.stringify()
    再次写出它。不需要尝试在JSON的中间做一些文本替换。它不起作用的原因可能是文本替换无法正常工作。仅供参考,如果两个
    消息
    事件同时发生,并且两个事件都试图读取/写入同一文件,则此处也很容易出现并发问题。您可能需要更新事件的队列。我使用
    require('./leadboard.json')
    以便收集countvalue变量,这不是必需的吗?您应该只读取
    leadboard.json
    一次,而不是两次。那么,对于如何调用
    var countvalue=leadboard[username]您有什么建议吗
    不使用
    var leadboard=require('./leadboard.json')