fs.write&阅读不更新
fs.write & read not updating
基本上,我这里的代码是说,如果用户发送一条消息 !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)
});
}
这是发送 !submit 两次后我的控制台的样子:
从技术上讲,第二行应该从 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()
仅读取一次leaderboard.json
- 读取数据后,它使用
JSON.parse()
将其转换为JSON。
- 初始化用户 cnt(如果不在文件中)
- 直接更新 Javsacript 对象中的 cnt
- 使用
JSON.stringify()
写出更改的对象,将对象转换回 JSON
- 将新的提交控制台消息放入
fs.writeFile()
成功处理程序
- 从
var
切换到 const
和 let
尚未合并的问题:
- 如果多个
message
事件可以同时 "in-flight" 并发生冲突,则并发问题。
- 除了在出现错误时停止处理之外,还有更完整的错误处理(我不确定您的应用程序在这种情况下应该做什么,因为那是特定于应用程序的)。
- 您的
shoe
变量未在任何地方使用,不确定它在那里做什么。
基本上,我这里的代码是说,如果用户发送一条消息 !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)
});
}
这是发送 !submit 两次后我的控制台的样子:
从技术上讲,第二行应该从 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()
仅读取一次leaderboard.json
- 读取数据后,它使用
JSON.parse()
将其转换为JSON。 - 初始化用户 cnt(如果不在文件中)
- 直接更新 Javsacript 对象中的 cnt
- 使用
JSON.stringify()
写出更改的对象,将对象转换回 JSON - 将新的提交控制台消息放入
fs.writeFile()
成功处理程序 - 从
var
切换到
const
和 let
尚未合并的问题:
- 如果多个
message
事件可以同时 "in-flight" 并发生冲突,则并发问题。 - 除了在出现错误时停止处理之外,还有更完整的错误处理(我不确定您的应用程序在这种情况下应该做什么,因为那是特定于应用程序的)。
- 您的
shoe
变量未在任何地方使用,不确定它在那里做什么。