如何从Cloud Function访问Cloud Firestore?数据获取失败求助
问题分析与解决方案
你遇到的问题其实是典型的JavaScript异步操作执行顺序踩坑,再加上一个Firestore文档数据读取的小错误,咱们一步步拆解解决:
核心问题:异步代码的执行时机
Firestore的db.collection("authors").get()是异步操作,返回的是一个Promise——你的代码里直接同步导出了authors数组,但这时候then回调里的代码还没开始执行呢!
代码的实际执行顺序是这样的:
- 初始化
authors数组,添加"start test" - 发起Firestore数据请求(但不等待结果)
- 同步执行
authors.push("final test push") - 导出
authors数组 - 等同步代码全跑完,Firestore请求才返回,
then回调里的代码才开始执行,但这时候数组已经导出完毕了,新push的数据根本不会被包含在返回结果里
修复方案
第一步:修正Firestore数据读取逻辑,改用异步函数返回数据
把获取数据的逻辑改成异步函数,用async/await等待Firestore请求完成,同时注意:Firestore文档的字段必须通过doc.data()获取,不能直接访问doc.firstName
import * as admin from "firebase-admin" import * as functions from "firebase-functions" admin.initializeApp(functions.config().firebase) const db = admin.firestore() // 改成异步函数,返回Promise包裹的作者数据 export const getAuthors = async () => { const authors = [{ key: "start test" }] // 用await等待Firestore请求完成 const snapshot = await db.collection("authors").get() snapshot.forEach(doc => { // 先通过doc.data()拿到文档的完整数据对象 const docData = doc.data() const data = { id: doc.id, firstName: docData.firstName, lastName: docData.lastName } authors.push(data) authors.push({ key: "test in loop" }) }) authors.push({ key: "final test push" }) return authors }
第二步:在Cloud Function中等待异步函数完成再返回结果
修改你的服务器逻辑,用await等待getAuthors()的结果,确保返回数据时Firestore的内容已经被读取完毕:
import { getAuthors } from "./firestore" import express from "express" import { https } from "firebase-functions" const testServer = express() // 把路由处理函数改成async函数 testServer.get("*", async (req, res) => { res.setHeader("Content-Type", "application/json") try { // 等待异步获取数据完成 const authorsArray = await getAuthors() res.send(JSON.stringify({ data: authorsArray })) } catch (err) { // 增加错误处理,方便调试问题 res.status(500).send(JSON.stringify({ error: err.message })) } }) const test = https.onRequest(testServer) export { test }
这样修改后,你的请求就能正确返回Firestore中的作者数据了~
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

