无法从.txt文件正确读取值

时间:2019-04-17 07:37:06

标签: javascript discord.js

因此,我一直在为服务器创建Discord bot。我创建了命令“ join-chat”。因此,它创建了一个“请求”并将其发送到服务通道。每个请求都有一个ID。问题是,如果我将ID保存为变量,则下次bot断开连接时,该数字将重置。所以我决定将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'时,机器人会发送请求,但ID始终为0,而​​在文件中则为1。
有什么建议可以解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

这是处理异步操作时的常见主题。

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上提供的一些文章。

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