使用Firebase Function无法从Firestore获取数据的问题排查
我写了一个Firebase Function测试读取Firestore数据,但始终拿不到数据。另外一个获取Authentication用户列表的Function运行正常。调用这个接口时日志输出No such UserProfiles!,我已经确认Firestore规则允许该集合读取,且文档cnZbRQtnCnQ52kTbcxI6Zq7d3VA3确实存在于UserProfiles集合中。
我的代码如下:
import {onRequest} from "firebase-functions/v2/https"; import * as logger from "firebase-functions/logger"; import * as admin from "firebase-admin"; const serviceAccount = require('../serviceAccountKey.json'); // Initialize Firebase Admin SDK admin.initializeApp({ credential: admin.credential.cert(serviceAccount), }); const db = admin.firestore(); export const listUserProfiles = onRequest(async (request, response) => { response.set('Access-Control-Allow-Origin', '*'); try { const ref = db.collection("UserProfiles").doc("cnZbRQtnCnQ52kTbcxI6Zq7d3VA3"); const docSnap = await ref.get(); if (docSnap.exists) { console.log("Document data:", docSnap.data()); response.status(200).json(docSnap.data()); } else { console.log("No such UserProfiles!"); response.status(200).json({}); } } catch(error) { console.log('Error Getting profile:', error); response.status(500); response.statusMessage = `Error Getting profile: ${JSON.stringify(error)}`; response.send(error); } })
排查方向与解决方案
确认ServiceAccount密钥对应的项目
检查本地serviceAccountKey.json所属的Firebase项目,是否和你存储目标文档的项目完全一致。如果密钥来自其他测试项目,会导致Function连接到错误的Firestore实例。核对路径大小写是否完全匹配
Firestore的集合名、文档ID是大小写敏感的。仔细对比代码中的UserProfiles集合名、cnZbRQtnCnQ52kTbcxI6Zq7d3VA3文档ID,和Firestore控制台里的实际名称是否完全一致,避免因大小写差异导致找不到文档。检查多数据库场景的实例指向
如果你的项目启用了多数据库功能,默认Admin SDK会连接到默认数据库。若目标文档在非默认数据库中,需要初始化时指定数据库ID:const db = admin.firestore({ databaseId: "你的目标数据库ID" });验证部署环境与文档环境一致性
确认Function部署的环境(开发/生产)和文档所在的Firestore环境完全匹配,避免出现测试环境Function连接生产数据库这类跨环境错误。添加路径日志辅助排查
在代码中添加日志输出完整文档路径,确认引用的路径是否正确:console.log("目标文档路径:", ref.path);将日志输出的路径和Firestore控制台中目标文档的完整路径对比,快速定位路径错误。
内容的提问来源于stack exchange,提问作者Romer

