因此,我一直在为服务器创建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。
有什么建议可以解决这个问题吗?
答案 0 :(得分:2)
这是处理异步操作时的常见主题。
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上提供的一些文章。
作为挑战,您也可以尝试将第一种方式转化为承诺。