fs.write和read不更新

时间:2019-01-28 05:23:35

标签: javascript node.js discord fs discord.js

基本上,我在这里的代码是说,如果用户发送消息!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 :(得分: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()仅读取一次Leaderboard.json
  2. 读取数据后,它将使用JSON.parse()将其转换为JSON。
  3. 如果文件中还没有用户cnt,则将其初始化
  4. 直接更新Javsacript对象中的cnt
  5. 使用JSON.stringify()写入更改后的对象,以将对象转换回JSON
  6. fs.writeFile()成功处理程序中放置新的提交控制台消息
  7. const切换到letvar

尚未合并的问题:

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