【发布时间】:2019-04-15 12:10:24
【问题描述】:
我正在构建一个基于聊天的 Angular Firebase Web 应用程序。我的结构的简化示例:
|__ messages
|__ room1
|__ msg1
|__ author: ""
|__ message: ""
|__ user1: "user1"
|__ user2: "user2"
|__ user3: "user3"
|__ users
|__ room1
|__ user1: ...
|__ user2: ...
|__ user3: ...
我正在尝试编写规则“.write”来编写一条新消息(没有云功能),该消息必须有一个作者、一条消息和多个不同的用户 ID(这里是 user1、user2、user3)在 /users 下(= 不同的用户列表)。作者和消息没有问题,但我怎样才能改变部分?没有云功能还能实现吗?
这就是这部分规则现在的样子:
"$other": {
".validate": "$other === newData.val() && root.child('users/'+newData.val()).exists()"
}
(如果你关注过我,那么你应该明白$other在我的例子中代表user1、user2和user3)。
编辑:
基于上面的例子,假设用户 user4 加入了房间 1:
|__ messages
|__ room1
|__ msg1
|__ author: ""
|__ message: ""
|__ user1: "user1"
|__ user2: "user2"
|__ user3: "user3"
|__ users
|__ room1
|__ user1: ...
|__ user2: ...
|__ user3: ...
|__ user4: ...
现在一个用户写了一条消息:
|__ messages
|__ room1
|__ msg1
|__ author: ""
|__ message: ""
|__ user1: "user1"
|__ user2: "user2"
|__ user3: "user3"
|__ msg2
|__ author: ""
|__ message: ""
|__ user1: "user1"
|__ user2: "user2"
|__ user3: "user3"
|__ user4: "user4"
|__ users
|__ room1
|__ user1: ...
|__ user2: ...
|__ user3: ...
|__ user4: ...
消息必须遵循用户列表。
【问题讨论】:
-
您是否尝试过您给出的规则?因为这基本上就是
$变量的工作方式:其下的规则适用于不存在显式名称匹配的所有子节点。我通常会将用户放在users子节点下,只是为了让事情更明确。 -
是的,我做到了。这里的问题是我可以使用 user1 和/或 user2 和/或 user3 或不使用它们来写消息:这是缺少检查它们是否都在这里的部分。
-
啊,也就是说你还想在父节点的
.validate规则中添加newData.hasChildren(...)。我会写一个答案。
标签: firebase firebase-realtime-database firebase-security