无法从 .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。

要解决这个问题,您有两个选择:

  1. 将依赖于 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()
    ...
});
  1. 使用读取文件的同步版本(请注意,这将阻止所有进一步的操作,直到请求完成)。这可以让您跳过使用回调,但通常不推荐。
...
const data = fs.readFileSync('./requestID.txt');

requestID = parseInt(data, 10);

const emb = new Discord.RichEmbed()
...

有关异步操作的更多信息,请查看 MDN here 上提供的一些文章。

作为挑战,您也可以尝试将第一种方式转换为承诺。