javascript - 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 会更新。
提前感谢任何试图提供帮助的人!
解决方案
好吧,我想我修好了。
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;
});
到目前为止这是有效的,但只有时间才能证明它是否仍然回滚(它不应该)
我认为这个错误是由于有时,当文件被写入代码中的某个地方时,它会写入它在启动时读取的内容并“忘记”我对它所做的编辑。我真的不知道这是怎么发生的,但这似乎是问题所在。
推荐阅读
- json - 将 JSON 数据从 RESTful API 检索到 Tableau
- amazon-web-services - Cloudwatch 日志存储成本核算与 S3 成本核算
- recaptcha-v3 - recaptcha 在 localhost 而不是在 ip-Address 上工作,显示站点所有者的错误:站点密钥的域无效:
- git - 如何使用 Ansible 将代码从本地 git 存储库部署到远程服务器
- python - 如何改进使用 GAN 进行时间序列预测/异常检测的结果
- port - Cloudflare 页面规则以匹配端口
- python-3.x - 创建数据类时,我可以使用类型模块中的 Union 和 Optional 类型吗?
- python - 如何根据 if 语句的结果缩短附加到不同列表的时间
- javascript - 如何使用按钮显示/隐藏容器
- c# - EntityType' 是一个变量,但在使用反射时像类型一样使用