首页 > 解决方案 > Firebase 规则与孩子的数量不同

问题描述

我正在构建一个基于聊天的 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: ...

消息必须遵循用户列表。

标签: firebasefirebase-realtime-databasefirebase-security

解决方案


你想在这里做一些事情:

  1. 该节点必须具有user1,user2user3属性。
  2. 这些属性的值必须作为键存在/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()"
    }

  }
}

推荐阅读