首页 > 解决方案 > 防止在 Firebase 函数中调用子触发器

问题描述

美好的一天,我对 firebase 函数中子触发器的行为有一点困难。为了演示,我创建了一个小项目。

  1. 我们有一个像这样的实时数据库结构:开始

  2. 和 firebse 触发器。第一个触发器在项目创建时增加计数。第二个在项目删除时减少计数。删除列表时最后触发删除项目:

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();

// ON CREATE ITEM 
export const onItemCraate  = functions.database.ref('listItems/{listKey}/{itemKey}').onCreate(async(snapshot, context)=>{
  try{
      return  admin.database().ref(`list/${context.params.listKey}/itemCount`).transaction(count =>{
        return count+1;
    });
  }catch (error){
    throw new functions.https.HttpsError(error.code, error.message, error.details);
  }
})

// ON DELETE ITEM 
export const onItemDelete  = functions.database.ref('listItems/{listKey}/{itemKey}').onDelete(async(snapshot, context)=>{
  try{
      return  admin.database().ref(`list/${context.params.listKey}/itemCount`).transaction(count =>{
        return count-1;
    });
  }catch (error){
    throw new functions.https.HttpsError(error.code, error.message, error.details);
  }
},)

// ON LIST DELETE
export const onListDelete  = functions.database.ref('list/{listKey}').onDelete(async(snapshot, context)=>{
  try{
      return  admin.database().ref(`listItems/${context.params.listKey}`).remove();
  }catch (error){
    throw new functions.https.HttpsError(error.code, error.message, error.details);
  }
})

所以问题是:当我删除列表时,“onDeleteList”触发删除项目firebase为每个listItem触发“onItemDelete”。然后在“ghost”列表中更新“itemCount”。当父母被移除时,有什么方法可以防止孩子触发呼叫?下图:

删除前 删除

删除后 删除后

日志 日志

标签: typescriptfirebasefirebase-realtime-databasegoogle-cloud-functions

解决方案


当父母被移除时,有什么方法可以防止孩子触发呼叫?

不会。删除父节点时会隐式删除子节点,这将始终触发与子节点路径匹配的 onDelete 函数。

如果您希望触发器在某些情况下执行不同的操作,则必须对该函数进行编码以检测该情况并采取相应措施。


推荐阅读