#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.
Чтобы решить эту проблему, у вас есть два варианта:
- Поместите код, который полагается на
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 здесь .
В качестве проблемы вы также можете попытаться преобразовать первый способ в обещание.
Комментарии:
1. Второй метод намного чище и проще.
2. Я использовал второй метод, и он работает! Спасибо, MrBobby!