使用Cloud Functions更新Cloud Firestore评论数时遇TypeError:无法读取'ref'属性
问题分析与解决方案
嘿,这个问题我之前也碰到过!错误的根源是你用了旧版本Firebase Functions的写法,和当前版本的API结构不匹配了。
错误原因
你看到的TypeError: Cannot read property 'ref' of undefined,是因为在当前版本的Firebase Cloud Functions中,onCreate触发器的第一个参数是文档快照对象,而不是包含after属性的event对象。你代码里的event.after是v0.9及更早版本的写法,新版本里已经没有这个嵌套结构了,所以event.after会返回undefined,自然就触发了这个报错。
另外,因为是onCreate触发器,只有当新评论文档被创建时才会触发,所以快照必然是存在的,你代码里的if (event.after.exists())判断完全是多余的,可以直接去掉。
修正后的代码
exports.updateCommentNumbers = functions.firestore .document('postlist/{postlistId}/comments/{commentsID}') .onCreate((snapshot, context) => { // 获取评论集合的引用 const collectionRef = snapshot.ref.parent; // 获取父文档的comment_number字段引用 const countRef = collectionRef.parent.child('comment_number'); // 因为是onCreate触发器,直接设置增量为1 const increment = 1; return countRef.transaction((current) => { return (current || 0) + increment; }).then(() => { console.log('Comments numbers updated.'); return null; }); });
关键修改点
- 将触发器参数从
event改为snapshot(同时保留可选的context参数,如果你需要用到路由参数比如postlistId的话) - 直接使用
snapshot.ref.parent获取评论集合的引用,替代原来的event.after.ref.parent - 移除了多余的存在性判断,因为
onCreate只会在文档创建时触发,快照一定有效 - 在
then回调里明确返回null,符合Cloud Functions的异步处理要求
内容的提问来源于stack exchange,提问作者Jack Wilson
相关产品推荐
相关产品推荐

