Firebase 按预期拒绝 PermissionDenied 更新,但监听节点的客户端仍然接收到发送的数据

Firebase rejects update with PermissionDenied as expected but still the client listening to the node receives the data sent

我正在监听实时数据库中的一个节点,并且发送了一个不应通过安全规则的多路径更新。应该通过写入规则而不是验证规则。

检查 firebase 控制台,没有按预期写入任何内容。但是使用 onChildAdded 监听其中一个节点的客户端接收到发送的数据。

是否可能没有任何内容提交到数据库,但仍然在客户端触发 onChildAdded?

我认为这是不可能的,但也许我遗漏了一些关于规则验证 + 多路径更新的内容。

在控制台上打印收到的事件:

event: Instance of 'QueryEvent' | event.snapshot: Instance of 'DataSnapshot' | event.snapshot.val: {c: true, m: e3, n: 1} [2021-08-31T18:14:33.230Z] @firebase/database: FirebaseError: PERMISSION_DENIED: Permission denied (PERMISSION_DENIED)

发送的数据,我是这样进行多路径更新的:

Map<String, dynamic> updateToSend = {};

updateToSend["status/c"] = move.c;
updateToSend["status/n"] = move.n;
updateToSend["moves/${move.n}/n"] = move.n;
updateToSend["moves/${move.n}/m"] = move.m;
updateToSend["moves/${move.n}/c"] = move.c;

await fb.database().ref('games/$gameID').update(updateToSend);

听众:

final movesRef = fb.database().ref("/games/${gameId}/moves");
final streamMoves = movesRef.onChildAdded;

streamMoves.listen((event) {
  print(
      "event: $event | event.snapshot: ${event.snapshot} | val: ${event.snapshot.val()}");
  ...
}

在执行写入操作的客户端上,受影响路径的侦听器会立即触发 - 甚至在数据发送到服务器之前。如果写入被服务器拒绝,SDK 实际上会触发协调事件以确保应用可以再次处于正确的状态。

因此:如果您 收听 onChildRemoved 流,一旦服务器拒绝写入操作,您将在那里收到一个事件。这使您可以再次将其从 UI 中删除。无法阻止获取初始本地事件。