Firebase onCreate Cloud Function异常:评论跟踪数据异常求助
Firebase Cloud Function onCreate 触发后统计数据异常(数值先错变后归零)
我使用React和Firebase开发站点,为实现新增评论时统计跟踪数据(全局及用户端的总评论数、未发布评论数、未发布评论总评分),编写了一个onCreate Cloud Function。但实际执行时,跟踪文档数据会先出现错误变化(数值不增反降),随后又归零;Cloud Logging仅显示函数执行成功,无有效错误信息,请问该函数存在什么问题?
原代码
exports.onCreateReview = functions.firestore .document(`reviews/{document}`) .onCreate(async (snapshot) => { const review = snapshot.data(); // overall reviews directory const trackingDocRef = firestore .collection("tracking") .doc("reviewTracking"); // user directory const profileDocRef = firestore.collection("profiles").doc(review.proID); trackingDocRef.update({ reviewsAll: admin.firestore.FieldValue.increment(1), reviewsUnpublishedNo: admin.firestore.FieldValue.increment(1), reviewsUnpublishedRating: admin.firestore.FieldValue.increment( review.ratingOverall ), }); profileDocRef.update({ reviewsAll: admin.firestore.FieldValue.increment(1), reviewsUnpublishedNo: admin.firestore.FieldValue.increment(1), reviewsUnpublishedRating: admin.firestore.FieldValue.increment( review.ratingOverall ), }); });
问题分析及解决方案
1. 未等待异步更新操作完成
update() 是异步Promise操作,但代码里没有用 await 等待它执行完成。Cloud Function的生命周期会在函数执行到末尾时直接终止,此时Firebase会强制取消所有未完成的异步任务,导致数据更新不完整,甚至出现数值回滚、异常变化的情况。
2. 未处理目标文档不存在的场景
如果 tracking/reviewTracking 或 profiles/{proID} 文档不存在,update() 会直接抛出错误。但因为没有等待Promise也没有捕获错误,这个错误会被静默忽略,导致统计数据完全没有更新,甚至出现异常状态。
3. 缺少错误捕获与日志记录
没有添加 try/catch 块,无法捕获执行过程中的错误,Cloud Logging自然看不到有效错误信息,难以排查问题。
修正后的代码
exports.onCreateReview = functions.firestore .document(`reviews/{document}`) .onCreate(async (snapshot) => { try { const review = snapshot.data(); if (!review?.proID || review.ratingOverall == null) { functions.logger.error("评论数据不完整:缺少proID或评分信息"); return; } // 全局统计文档引用 const trackingDocRef = firestore .collection("tracking") .doc("reviewTracking"); // 用户统计文档引用 const profileDocRef = firestore.collection("profiles").doc(review.proID); // 使用set({merge: true})替代update,兼容文档不存在的情况 await trackingDocRef.set({ reviewsAll: admin.firestore.FieldValue.increment(1), reviewsUnpublishedNo: admin.firestore.FieldValue.increment(1), reviewsUnpublishedRating: admin.firestore.FieldValue.increment(review.ratingOverall), }, { merge: true }); await profileDocRef.set({ reviewsAll: admin.firestore.FieldValue.increment(1), reviewsUnpublishedNo: admin.firestore.FieldValue.increment(1), reviewsUnpublishedRating: admin.firestore.FieldValue.increment(review.ratingOverall), }, { merge: true }); functions.logger.info("评论统计数据更新成功"); } catch (error) { functions.logger.error("更新统计数据失败", error); throw error; // 抛出错误让Cloud Function标记为执行失败 } });
内容的提问来源于stack exchange,提问作者Coolkid
相关产品推荐
相关产品推荐

