Firestore触发器创建文档后查询返回undefined问题求助
问题排查与修复方案
1. 第一个云函数:未正确处理异步操作,导致文档创建不完整或失败
你的estFirst1RM函数中,db.collection('maxes').doc(newBenchMaxId).set(...)是异步操作,但函数未返回该操作的Promise,Cloud Functions会在异步任务完成前提前终止执行,导致文档可能创建失败或延迟生效。此外变量未用let/const声明,会造成全局作用域污染。
修复后的代码:
exports.estFirst1RM = functions.firestore.document('/onboardings/{documentId}') .onCreate(async (snapshot, context) => { const bench1RM = calc1RM(snapshot.data().benchRiR, snapshot.data().benchReps, snapshot.data().benchLoad); const uuid = snapshot.data().uuid; const newBenchMaxId = uuidv4(); // 返回set操作的Promise,确保函数等待文档创建完成再结束 return db.collection('maxes').doc(newBenchMaxId).set({ load: bench1RM, createdAt: admin.firestore.Timestamp.now(), maxType: 'bench', uuid: uuid, initial: true, }); });
2. 第二个查询函数:错误处理QuerySnapshot,而非DocumentSnapshot
调用where查询后,get()方法返回的是QuerySnapshot(查询结果集合),不是单个DocumentSnapshot,因此maxDoc.exists是无效属性,这就是控制台打印"No such document!"的核心原因。同时你引用了未定义的doc变量,直接访问maxDoc.load也不符合QuerySnapshot的结构。
修复后的getInitial1RM函数:
async function getInitial1RM(maxType, uuid){ const querySnapshot = await db.collection('maxes') .where('maxType', '==', maxType) .where('uuid', '==', uuid) .get(); if (querySnapshot.empty) { console.log('No such documents!'); return undefined; } else { // 假设每个uuid+maxType对应唯一文档,取第一个结果 const targetDoc = querySnapshot.docs[0]; console.log('Document data:', targetDoc.data()); const load = targetDoc.data().load; return load; } }
3. 关于Google Cloud Functions日志延迟
GCP Cloud Functions的日志确实存在10-20秒的延迟,这是平台的正常特性,但你的核心问题是代码逻辑错误导致文档未正确创建或查询失败,修复上述代码后,日志延迟不会影响功能正确性,仅需等待片刻即可查看日志内容。
内容的提问来源于stack exchange,提问作者Sam Yoon
相关产品推荐
相关产品推荐

