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

如何在Firebase HTTPS云函数中异步获取Firestore文档数据?

问题描述

开发应用模块时,需要调用Firebase云函数解析Firestore数据,返回字典用于填充Swift界面。云函数声明如下:

exports.getUIBetData = functions.https.onRequest( (request, response) => {

函数接收请求体中的userId参数,需获取user_dim集合中对应用户ID的文档数据并处理,但遭遇异步获取问题,报错信息:

TypeError: admin.firestore(...).collection(...).doc(...).get(...).data is not a function

当前查询代码:

const body = request.body;
const userId = body.data.userId;
const bettorIdDoc = admin.firestore()
    .collection("user_dim").doc(userId).get().data();

已确认user_dim是有效集合,userId为文档键,但无法访问文档字段,已知get().data()是异步操作,需解决主函数中的异步逻辑处理问题。

解决方案

核心问题是Firestore的get()方法是异步操作,返回的是Promise对象,而非直接的文档快照,因此不能直接链式调用.data()。必须等待Promise完成后,才能从返回的DocumentSnapshot对象中调用.data()获取数据。以下是两种可行的处理方式:

方式一:使用async/await(推荐,代码更简洁易读)

将云函数的处理函数标记为async,用await等待get()操作完成,再处理文档数据:

exports.getUIBetData = functions.https.onRequest(async (request, response) => {
  try {
    const body = request.body;
    const userId = body.data.userId;
    
    // 等待异步操作完成,获取文档快照
    const bettorDocSnapshot = await admin.firestore()
        .collection("user_dim").doc(userId).get();
    
    // 检查文档是否存在
    if (!bettorDocSnapshot.exists) {
      return response.status(404).json({ error: "用户文档不存在" });
    }
    
    // 从快照中提取数据
    const bettorIdDoc = bettorDocSnapshot.data();
    // 返回处理后的数据给Swift界面
    response.status(200).json(bettorIdDoc);
  } catch (error) {
    // 捕获并返回错误信息
    response.status(500).json({ error: error.message });
  }
});

方式二:使用Promise.then()链式调用

如果不熟悉async/await,也可以用Promise的链式调用处理异步逻辑:

exports.getUIBetData = functions.https.onRequest((request, response) => {
  const body = request.body;
  const userId = body.data.userId;
  
  admin.firestore()
      .collection("user_dim").doc(userId).get()
      .then(bettorDocSnapshot => {
        if (!bettorDocSnapshot.exists) {
          return response.status(404).json({ error: "用户文档不存在" });
        }
        const bettorIdDoc = bettorDocSnapshot.data();
        response.status(200).json(bettorIdDoc);
      })
      .catch(error => {
        response.status(500).json({ error: error.message });
      });
});

错误原因说明

原代码中get()返回的是Promise对象,而Promise并没有data()方法,只有当Promise成功解析为DocumentSnapshot对象后,才能调用其data()方法获取文档的字段数据。

内容的提问来源于stack exchange,提问作者jsmooth_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:46:04