首页 > 解决方案 > NodeJS Json 文件不断回滚

问题描述

我在节点中创建了一个不和谐的机器人,它将一个人发送的消息数量存储在一个 json 文件中。由于 Discord 上只有大约 20 人,我觉得没有必要使用数据库。但是,似乎当我用于托管的网站(我尝试过 repl.it 和 Heroku)有一段时间滞后时,json 会回滚到旧版本。它经常这样做,我找不到它的原因。

这是我编写数据的方式:

const Discord = require('discord.js');
const client = new Discord.Client();
const fs = require('fs');
const userDataFile = require('./userdata.json');

var currGuild;
client.on('ready', () => {
  console.log('Connected as ' + client.user.tag);
  currGuild = client.guilds.cache.get('*********438818862'); //this is the discord server my bot is used on
});

client.on('message', receivedMessage => {
  if (receivedMessage.member.roles.cache.some(r => r.name == 'Bot')) {
    return;
  }
  addScore(receivedMessage);
});

function addScore(receivedMessage){
  if (!userDataFile[receivedMessage.author.id]){
    userDataFile[receivedMessage.author.id] = {
      messageCount: 1,
      mult: 1,
      multTimer: 0
    };
  }
  else{
    userDataFile[receivedMessage.author.id].messageCount =
      userDataFile[receivedMessage.author.id].messageCount +
      userDataFile[receivedMessage.author.id].mult;
  }
  try {
    fs.writeFile('./userdata.json', JSON.stringify(userDataFile, null, 2), function(err) {
      if (err) throw err;
    });
  } catch (err) {
    console.error(err); //this error never pops up, implying that the file is always written properly
  }
  console.log('Message received');
}

client.login('***********************************************************');

这是json文件:

{
  "********9657277454": {
    "messageCount": 38,
    "mult": 1,
    "multTimer": 0
  },
  "********2295954465": {
    "messageCount": 3,
    "mult": 1,
    "multTimer": 0
  },
  "********5595918339": {
    "messageCount": 60,
    "mult": 1,
    "multTimer": 0
  },
  "********9101358080": {
    "messageCount": 3,
    "mult": 1,
    "multTimer": 0
  },
  "********1601591296": {
    "messageCount": 3,
    "mult": 1,
    "multTimer": 0
  },
  "********2859962381": {
    "messageCount": 1,
    "mult": 1,
    "multTimer": 0
  }
}

还有其他功能可以修改此文件,以更新 multTimer 以及 mult。我没有显示这些以避免使代码太长。multTimer 只是每分钟更新一次,如果每个人的值大于 0,则将其删除 1。当该人在聊天中赢得随机迷你游戏时,Mult 会更新。

提前感谢任何试图提供帮助的人!

标签: javascriptnode.jsdiscorddiscord.jsbots

解决方案


好吧,我想我修好了。

require('./userdata.json');每次我需要像这样写入它时,我都会读取它,而不是使用 json 文件 :

let rawUserDataFile = fs.readFileSync('./userdata.json');
var userDataFile = JSON.parse(rawUserDataFile);

然后我简单地写我之前做的相同的方式:

fs.writeFile('./userdata.json', JSON.stringify(userDataFile, null, 2), function(err) {
  if (err) throw err;
});

到目前为止这是有效的,但只有时间才能证明它是否仍然回滚(它不应该)

我认为这个错误是由于有时,当文件被写入代码中的某个地方时,它会写入它在启动时读取的内容并“忘记”我对它所做的编辑。我真的不知道这是怎么发生的,但这似乎是问题所在。


推荐阅读