无法从 .txt 文件中正确读取值
Cannot read value from .txt file correctly
所以,我一直在为我的服务器创建 Discord 机器人。我创建了命令 "join-chat"。所以它创建了一个 'request' 并将其发送到服务通道。每个请求都有一个 ID。问题是,如果我将 ID 保存为变量,下次机器人断开连接时该数字会重置。所以我决定将 ID 计数器保存在文件中。
这是实现:
if (command === "join-chat") {
let requestID = 0; //creating variable 'requestID'
fs.readFile('./requestID.txt', 'utf-8', (err,data) => { //reading file
if (err) {
return console.log(err);
}
requestID = parseInt(data, 10); //and parsing string to integer
//console.log('Read data succesfully!');
})
//requestID_num = requestID.replace(new RegExp('0'), '');
const emb = new Discord.RichEmbed()
.setTitle('New request')
.setDescription('Request to add to chat')
.addField('Who?', `**User ${msg.author.tag}**`)
.addField('Which chat?', `**Chat: ${args[0]}**`)
.setFooter('Request\'s ID: ' + requestID)
.setColor('#fffb3a');
requestID++;
fs.writeFile('./requestID.txt', requestID.toString(), err =>{
if (err) {
return console.log(err);
}
//console.log('Wrote file succesfully!\n');
})
let chan = client.channels.get('567959560900313108');
chan.send(emb);
}
现在的问题是,当我输入聊天“.join-chat test”时,bot 发送请求,但 ID 始终为 0,而在文件中为 1。
有什么解决办法的建议吗?
这是处理异步操作时的常见话题。
requestID
为零的原因是您在 fs.readFile
请求之外访问它,这是一个异步操作。这意味着 requestID
的值在 fs.readFile
请求的回调内部仅为 1,而在其外部仍为 0。
要解决这个问题,您有两个选择:
- 将依赖于
requestID
的代码放在 fs.readFile
回调中。这样您就可以确保 requestID 始终设置为您正在读取的文件中的最新值。
...
fs.readFile('./requestID.txt', 'utf-8', (err, data) => {
if(err) {
return console.log(err);
}
requestID = parseInt(data, 10);
const emb = new Discord.RichEmbed()
...
});
- 使用读取文件的同步版本(请注意,这将阻止所有进一步的操作,直到请求完成)。这可以让您跳过使用回调,但通常不推荐。
...
const data = fs.readFileSync('./requestID.txt');
requestID = parseInt(data, 10);
const emb = new Discord.RichEmbed()
...
有关异步操作的更多信息,请查看 MDN here 上提供的一些文章。
作为挑战,您也可以尝试将第一种方式转换为承诺。
所以,我一直在为我的服务器创建 Discord 机器人。我创建了命令 "join-chat"。所以它创建了一个 'request' 并将其发送到服务通道。每个请求都有一个 ID。问题是,如果我将 ID 保存为变量,下次机器人断开连接时该数字会重置。所以我决定将 ID 计数器保存在文件中。
这是实现:
if (command === "join-chat") {
let requestID = 0; //creating variable 'requestID'
fs.readFile('./requestID.txt', 'utf-8', (err,data) => { //reading file
if (err) {
return console.log(err);
}
requestID = parseInt(data, 10); //and parsing string to integer
//console.log('Read data succesfully!');
})
//requestID_num = requestID.replace(new RegExp('0'), '');
const emb = new Discord.RichEmbed()
.setTitle('New request')
.setDescription('Request to add to chat')
.addField('Who?', `**User ${msg.author.tag}**`)
.addField('Which chat?', `**Chat: ${args[0]}**`)
.setFooter('Request\'s ID: ' + requestID)
.setColor('#fffb3a');
requestID++;
fs.writeFile('./requestID.txt', requestID.toString(), err =>{
if (err) {
return console.log(err);
}
//console.log('Wrote file succesfully!\n');
})
let chan = client.channels.get('567959560900313108');
chan.send(emb);
}
现在的问题是,当我输入聊天“.join-chat test”时,bot 发送请求,但 ID 始终为 0,而在文件中为 1。
有什么解决办法的建议吗?
这是处理异步操作时的常见话题。
requestID
为零的原因是您在 fs.readFile
请求之外访问它,这是一个异步操作。这意味着 requestID
的值在 fs.readFile
请求的回调内部仅为 1,而在其外部仍为 0。
要解决这个问题,您有两个选择:
- 将依赖于
requestID
的代码放在fs.readFile
回调中。这样您就可以确保 requestID 始终设置为您正在读取的文件中的最新值。
...
fs.readFile('./requestID.txt', 'utf-8', (err, data) => {
if(err) {
return console.log(err);
}
requestID = parseInt(data, 10);
const emb = new Discord.RichEmbed()
...
});
- 使用读取文件的同步版本(请注意,这将阻止所有进一步的操作,直到请求完成)。这可以让您跳过使用回调,但通常不推荐。
...
const data = fs.readFileSync('./requestID.txt');
requestID = parseInt(data, 10);
const emb = new Discord.RichEmbed()
...
有关异步操作的更多信息,请查看 MDN here 上提供的一些文章。
作为挑战,您也可以尝试将第一种方式转换为承诺。