javascript - 删除多个数据库,仅注册一个云函数

标签 javascript firebase firebase-realtime-database google-cloud-functions

我编写了一个云函数,用于监听 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/

相关文章:

javascript - ACE.js : different completers for different same-page editors

javascript - firebase.database() 不是函数 - 新的 Firebase 项目

javascript - 检查数据库中的现有数据

android - 从 Firebase 视觉文本检测总量

python - 过期的 firebase 身份验证 token 的异常处理

javascript - 使用 Firebase 云功能从 firebase 发送推送通知

javascript - jquery 的很多 if 语句的替代品

javascript - 如何在内联样式属性(React)中延迟加载背景图像?

javascript - 为什么控制台输出未定义?

node.js - 使用 Cloud Functions 和 Firestore 的 Firebase 动态页面速度很慢