You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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}, 请先创建账号`);
  }
})

已存储的数据示例

Firebase中已存储的数据示例截图

内容的提问来源于stack exchange,提问作者Jitesh Mogana Raja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:09:00