如何在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_
相关产品推荐
相关产品推荐

