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()
将其转换为JSONJSON.stringify()
写出已更改的对象,以将该对象转换回JSONfs.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')代码>?