【问题标题】:Counter triggered when node is deleted/created, but triggers also for changes of children删除/创建节点时触发计数器,但也会触发子节点的更改
【发布时间】:2018-06-18 18:07:24
【问题描述】:

这是我的 firebase 数据库的结构:

/UserData
/DeviceMgmt
  /Counters
      /NumberOfAll:
      /NumberOfSelected
      /TotalDownloaded
    ...
  /Devices
      /pushId1
        /uid
        /toSelect=true (optional)
        /downloaded
        /lastDownload

      /pushId2
      /pushId2
       ...

我的代码:

exports.countNumberOfAllDevices = functions.database.ref('/UserData/DeviceMgmt/Devices/{pushId}').onWrite(
(change) => {
  const collectionRef = change.after.ref;// /UserData/DeviceMgmt/Devices/{pushId}
  const countRef = collectionRef.parent.parent.child('Counters/NumberOfAll');

  let increment;
  if (change.after.exists() && !change.before.exists()) {
    increment = 1;
  } else if (!change.after.exists() && change.before.exists()) {
    increment = -1;
  } else {
    return null;
  }

  return countRef.transaction((current) => {
    return (current || 0) + increment;
  }).then(() => {
    return console.log('counter /UserData/Counters/NumberOfAll updated.');
  });
});

基于functions-samples/child-count/,其中推送的消息被我的设备替换,但我的设备有孩子,示例中的消息是无孩子的。

我的问题是:

1。 当我的设备在 java 中创建时,一种是创建对象,另一种是更新其子设备,因此 NumberOfAll 计数器递增 2。

  1. 在 {pushId} 设备中的每次更改时,该函数都会运行无用,因为这不会更改设备的数量。

我应该用

替换 countNumberOfAllDevices

两个功能:

  1. incrementNumberOfAllDevicesonCreate(创建设备对象后不再创建子对象)

  2. decrementNumberOfAllDevicesonDelete(在删除设备对象之前没有删除任何子对象)

深入了解来自

的快照参考
/Devices/{pushId}

/Devices/{pushId}/uid

什么时候 uid 在创建和删除之间永远不会改变?

我的触发云函数的 Java 代码:

testAddNewDeviceToDevices(String token) { 
  Device device = new Device( "Test", 0, token); 
  String deviceKey = dbRefDevices.push().getKey(); 
  dbRefDevices.child(deviceKey).setValue(device)
    .addOnFailureListener(new OnFailureListener() { 
      @Override public void onFailure(@NonNull Exception e) { 
        Log.e(TAG, "failed. Exception: ", e); 
      } 
    }); 
  }

【问题讨论】:

  • change.after.exists() && !change.before.exists()!change.after.exists() && change.before.exists() 仅用于选择创建和删除。我不确定为什么这些子句中的任何一个都与创建较低级别的节点/值相匹配。你能在这个函数中展示触发该行为的最小 Java 代码吗?
  • 谢谢弗兰克,这很奇怪。当我从控制台添加设备时,它会增加一,当我运行如下代码时,它会增加两次:
  • public static void testAddNewDeviceToDevices(String token) { Device device = new Device("Test", 0, token); String deviceKey = dbRefDevices.push().getKey(); dbRefDevices.child(deviceKey).setValue(device) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.e(TAG, "failed. Exception: ", e); } }) ; }
  • testAddNewDeviceToDevices 只写入数据库一次(push() 不会导致写入),所以我认为这不会导致计数器上升两次。

标签: node.js firebase google-cloud-functions


【解决方案1】:

您应该使用 onCreate 和 onDelete。它们是在 SDK 的 1.0 版中引入的,正是您所描述的情况。它将大大简化您的代码。

IMO,onWrite 没那么有用。这是 1.0 之前的遗留触发器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多