如何在Discord.JS中调用Firebase的.get()方法读取Cloud Firestore数据
问题根因
你遇到的问题是JavaScript异步执行顺序导致的。Firestore的get()是异步IO操作,发起请求后不会阻塞后续代码执行,你当前的代码在Firebase还没返回数据时,就已经执行了创建Embed、发送消息的逻辑,此时wallet变量还没被赋值,自然无法正常展示数据。
解决方案
有两种常用修复方案,推荐优先用async/await写法,可读性更高:
方案1:async/await写法
首先需要给你当前的Discord事件回调函数加上async修饰,示例如下:
// 注意事件回调函数前加async client.on('messageCreate', async (message) => { // 其他逻辑... // 等待Firebase返回查询结果 const userDoc = await db.collection("data").doc(message.author.id).get(); if (!userDoc.exists) { message.channel.send(`${message.author.tag}, 请先创建账号`); return; } const userData = userDoc.data(); const wallet = userData.userWallet; // 拿到数据后再构造Embed const embed = new Discord.MessageEmbed() .setTitle(`${message.author.tag}的账户余额`) .setAuthor(`${client.user.tag}`) .setColor("RANDOM") .setDescription(`Created by ${client.user.tag}`) .addFields( {name: "钱包余额", value: `${wallet}`} ) .setImage("https://c.tenor.com/iQ7AzP7EgSAAAAAM/noice.gif"); message.reply({embeds: [embed]}); })
方案2:保持原来的.then链式写法
如果不想修改外层函数的async修饰,把Embed构建逻辑全部放到then的回调内部即可:
db.collection("data").doc(message.author.id).get().then((q) => { if (q.exists) { const wallet = q.data().userWallet; const embed = new Discord.MessageEmbed() .setTitle(`${message.author.tag}的账户余额`) .setAuthor(`${client.user.tag}`) .setColor("RANDOM") .setDescription(`Created by ${client.user.tag}`) .addFields( {name: "钱包余额", value: `${wallet}`} ) .setImage("https://c.tenor.com/iQ7AzP7EgSAAAAAM/noice.gif"); message.reply({embeds: [embed]}); } else { message.channel.send(`${message.author.tag}, 请先创建账号`); } })
已存储的数据示例

内容的提问来源于stack exchange,提问作者Jitesh Mogana Raja
相关产品推荐
相关产品推荐

