升级Firebase Cloud Functions至v1.0后Realtime Database触发器ref对象缺失问题
解决Firebase Cloud Functions v1.0中Realtime Database触发器ref缺失的问题
这个问题我升级v1.0的时候也踩过坑,确实新版本对触发器参数结构做了不小调整,原来的event.data拆分后很容易找不到熟悉的ref对象。
核心变化说明
在v0.x版本里,我们靠event.data.ref获取数据库引用,但v1.0根据触发器类型不同,ref的获取路径有区别:
- 对于
onWrite触发器:参数变为change和context,change包含数据变更前后的快照(change.before和change.after),两个快照都自带ref属性 - 对于
onCreate、onDelete、onUpdate触发器:参数是snapshot和context,这里的snapshot就是对应的数据快照,直接通过snapshot.ref就能拿到引用
修复代码示例
如果用的是onWrite触发器,原来的代码可能是这样:
// v0.x版本写法 exports.myFunction = functions.database.ref('/items/{itemId}').onWrite(event => { const ref = event.data.ref; // 其他业务逻辑 });
升级到v1.0后要改成:
// v1.0版本正确写法 exports.myFunction = functions.database.ref('/items/{itemId}').onWrite((change, context) => { // 根据业务需求选择before或after的ref const ref = change.after.ref; const parentRef = ref.parent; // 现在可以正常调用parent方法了 // 其他业务逻辑 });
如果是onCreate这类单快照触发器:
// v1.0版本正确写法 exports.createItem = functions.database.ref('/items/{itemId}').onCreate((snapshot, context) => { const ref = snapshot.ref; const parentRef = ref.parent; // 不会再出现"Cannot read property 'parent' of undefined"的错误 // 其他业务逻辑 });
常见误区提醒
不少人会误以为context参数里包含ref,但其实context主要用来获取路径参数(比如context.params.itemId)和元数据,ref还是要从数据快照里获取。如果你的data.ref显示undefined,大概率是把change对象当成了数据快照,或者在onWrite里错误地直接访问了不存在的属性。
内容的提问来源于stack exchange,提问作者A.M. Masudul Haque
相关产品推荐
相关产品推荐

