javascript - 如何防止更改子节点字段后父节点触发云函数?

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

我的 Firebase 实时数据库的结构如下:

-- Stock
   -- StoreId
      -- DepartmentId_1
         -- ProductId_1
            -- name: "productName"
            -- price: 1.0
      -- DepartmentId_2
         -- ProductId_X
            -- name: "productNameX"
            -- price: 1.0

我想读取 DepartmentId 以便在 RecyclerView 中显示它们。但 Android Firebase Listener 会检索 StoreId 中包含的所有数据。

我知道我可以使用 for 循环并获取 key ,但这不是重点。问题在于下载的数据量,这可能会超出我在 Firebase 中的配额。

因此,我决定使用 Cloud Functions 在其他节点中写入 key ,如下所示:

-- Departments
   -- StoreId
      -- DepartmentId_1: true
      -- DepartmentId_2: true
      -- DepartmentId_3: true
      -- DepartmentId_4: true
              .
              .
              .

我以为 Cloud Functions 只会在特定节点中触发,但事实证明,如果我更改 price 字段,我的 Cloud Function 就会被触发。

所以我的问题是:如何仅在添加或删除 departmentId 时触发我的云功能?

下面是我的第一步,那么如何循环遍历 departmentId 并将它们写入 Departments 节点中?

exports.createStoreDepartments = functions.database
.ref('Stock/{storeId}')
.onWrite((change,context) => {
  console.log('DATA CHANGED');
  return true;
});

感谢任何帮助!

最佳答案

How to trigger my Cloud Function only when either a departmentId is added or removed?

有两种方法可以做到这一点:

  1. 有两个独立的触发器。

    exports.createStoreDepartments = functions.database
    .ref('Stock/{storeId}/{departmentId}')
    .onCreate((snapshot, context) => {
        ...
    

    exports.createStoreDepartments = functions.database
    .ref('Stock/{storeId}/{departmentId}')
    .onDelete((snapshot, context) => {
        ...
    
  2. 使用单个 onWrite 触发器。

    exports.createStoreDepartments = functions.database
    .ref('Stock/{storeId}/{departmentId}')
    .onWrite((change,context) => {
        if (!change.before.exists()) {
          // TODO: this department was just created
        }
        if (!change.after.exists()) {
          // TODO: this department was just deleted
        }});
    

关于javascript - 如何防止更改子节点字段后父节点触发云函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60876926/

相关文章:

javascript - 使用 jQuery 动画滚动顶部总是从顶部开始

javascript - 纯JavaScript中的表单处理和验证

javascript - 在 fetch 启动后制作不可点击的按钮 React Native

swift - 如何从字符串值 Swift 中删除可选

typescript - Firebase 通过函数 : "7 PERMISSION_DENIED: Missing or insufficient permissions" 写入 Firestore 时出错

firebase - 是否可以在 firebase 上运行 graphql 订阅?

javascript - 无法获取 strip 支付意图成功元数据

javascript - 带有携带功能的变异数组?

swift - 每月重置一个值 - swift 和 firebase

android - 在 Firebase Auth (android) 之后在数据库中创建用户