基本上,我在这里的代码是说,如果用户发送消息!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)
});
}
这是我的控制台发送两次!提交后的样子:
从技术上讲,第二行应从1变为2,而无需关闭并重新启动脚本。
我知道这似乎有些复杂,但任何帮助将不胜感激!
答案 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}`);
});
});
}
});
更改摘要:
fs.readFile()
仅读取一次Leaderboard.json JSON.parse()
将其转换为JSON。JSON.stringify()
写入更改后的对象,以将对象转换回JSON fs.writeFile()
成功处理程序中放置新的提交控制台消息const
切换到let
和var
尚未合并的问题:
message
”事件可以同时“发生”并且发生冲突,则并发问题。shoe
变量没有在任何地方使用,不确定它在做什么。