Не удается правильно прочитать значение из файла .txt

#javascript #discord.js

#javascript #discord.js

Вопрос:

Итак, я создавал Discord 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», бот отправляет запрос, но идентификатор всегда равен 0, а в файле — 1.
Есть предложения, как это решить?

Комментарии:

1. Попробуйте распечатать данные сразу после файла fs.ReadFile

2. Я думаю, это потому, что ваш код сломается, .setFooter(... потому что вы не экранировали ( ' ) свой ' знак. Потому что сразу после того, как вы неправильно закрываете строку, вы пытаетесь увеличить свой идентификатор и сохранить его в свой файл — но этого никогда не происходит, поскольку ваш код никогда не достигает этой точки.

3. CodeF0x, добавлен », но он по-прежнему не работает.

Ответ №1:

Это распространенная тема при работе с асинхронной операцией.

Эта requestID нулевая причина заключается в том, что вы обращаетесь к нему вне fs.readFile запроса, который является асинхронной операцией. Это означает, что значение requestID только 1 внутри обратного fs.readFile вызова запроса, а вне его оно по-прежнему равно 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 здесь .

В качестве проблемы вы также можете попытаться преобразовать первый способ в обещание.

Комментарии:

1. Второй метод намного чище и проще.

2. Я использовал второй метод, и он работает! Спасибо, MrBobby!