我编写了一个云函数,用于监听 Firebase 实时数据库中的删除操作。如果只有一项删除,它会非常有效 - 控制台会显示该项目已被删除。
但是,如果我的实时数据库中同时存在多个删除,我的云功能只会针对其中一个删除触发!我做错了什么?
这是我的场景:我在同一站点上打开两个浏览器选项卡。每次我在每个选项卡中连接到我的网络应用程序时,我都会通过 push
创建一个实时数据库条目和一个引用。然后,我通过关闭浏览器窗口来关闭这两个选项卡,该窗口对我的引用调用 onDelete
,从而触发通过 remove
删除数据库上的该引用 - 我可以确认这两个选项卡已从数据库中删除。但是,我的云函数中只注册了其中一项删除。
云函数
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.onPresenceRemove = functions.database.ref('/status/app').onDelete( (snapshot, context) => {
const original = snapshot.val();
console.error( 'snapshot', original, snapshot, context );
return true;
});
js实时数据库代码
presenceDoc = firebase.database().ref( '/status/app' );
firebase.database().ref( '.info/connected' ).on( 'value', function( snapshot ) {
if ( snapshot.val() === true ) {
presenceRef = presenceDoc.push( userId );
presenceRef.onDisconnect().remove();
}
});
最佳答案
您的云函数设置为触发时间:
functions.database.ref('/status/app').onDelete
因此,当 /status/app
被删除时(即当其最后一个子节点被删除时),您的函数将被触发,并显示 /status/app< 下最后数据的快照
删除之前。
您的客户端代码似乎在 /status/app
下添加新的子节点,其结构如下:
status
app
pushId1: userId1
pushId2: userId1
pushId3: userId2
只有当/status/app
的应用程序被删除时,您的云函数才会被触发,因此当最后一个子节点被删除时。
您可能希望在每个子项被删除时触发您的云功能。为此,您的触发器应该位于树中的下一级:
functions.database.ref('/status/app/{pushId}').onDelete(...
关于javascript - 删除多个数据库,仅注册一个云函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56085900/