孩子数变化的Firebase规则
我正在构建一个基于聊天的firebase web应用程序。我的结构的简化示例:孩子数变化的Firebase规则,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我正在构建一个基于聊天的firebase web应用程序。我的结构的简化示例: |__ messages |__ room1 |__ msg1 |__ author: "" |__ message: "" |__ user1: "user1" |__ user2: "user2"
|__ 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: ...
消息必须位于用户列表之后。您希望在此处看到以下内容:
user1
、user2
和user3
属性/users
"messages": {
"$messageId": {
".validate": "newData.hasChildren('author', 'message', 'user1', 'user2', 'user3')",
"author": {
".validate": "newData.isString()",
}
"message": {
".validate": "newData.isString()",
}
"$other": {
".validate": "$other === newData.val() && root.child('users/'+newData.val()).exists()"
}
}
}
在这里,您需要一些东西:
user1
、user2
和user3
属性/users
"messages": {
"$messageId": {
".validate": "newData.hasChildren('author', 'message', 'user1', 'user2', 'user3')",
"author": {
".validate": "newData.isString()",
}
"message": {
".validate": "newData.isString()",
}
"$other": {
".validate": "$other === newData.val() && root.child('users/'+newData.val()).exists()"
}
}
}
你试过你给的规则了吗?因为这就是
$
变量的基本工作原理:该变量下的规则适用于不存在显式名称匹配的所有子节点。我通常会把用户放在users
子节点下,只是为了让事情更加明确。是的,我这样做了。这里的问题是,我可以使用user1和/或user2和/或user3编写消息,也可以不使用它们全部编写消息:这是缺少的部分,用于检查它们是否都在这里。啊,这意味着您仍然希望向父节点的规则添加newData.haschilds(…)
。我会写一个答案。你试过你给的规则了吗?因为这就是$
变量的基本工作原理:该变量下的规则适用于不存在显式名称匹配的所有子节点。我通常会把用户放在users
子节点下,只是为了让事情更加明确。是的,我这样做了。这里的问题是,我可以使用user1和/或user2和/或user3编写消息,也可以不使用它们全部编写消息:这是缺少的部分,用于检查它们是否都在这里。啊,这意味着您仍然希望向父节点的规则添加newData.haschilds(…)
。我会写一个答案。也许我不够清楚。对此我很抱歉。正如我所说,$other代表user1、user2和user3;这只是一个示例,它们不是固定的子对象,而是变化的子对象,请查看我的编辑我添加了一个示例。是的,只有将所有这些子对象都放在每条消息下的$msgid/users
节点中,我才会看到这一点,因为这样每个孩子也必须在/users
下生存。我想简化我的示例,但实际上你完全正确,每条消息和每个用户都在一个“房间id”下。我更新了,如果还不清楚请告诉我!弗兰克,你知道吗?也许我不够清楚,抱歉。正如我所说,$other代表user1、user2和user3;这只是一个示例,它们不是固定的子对象,而是变化的子对象,请查看我的编辑我添加了一个示例。是的,只有将所有这些子对象都放在每条消息下的$msgid/users
节点中,我才会看到这一点,因为这样每个孩子也必须在/users
下生存。我想简化我的示例,但实际上你完全正确,每条消息和每个用户都在一个“房间id”下。我更新了,如果还不清楚请告诉我!弗兰克,有什么想法吗?