如何在firebase实时数据库规则中设置变量

Posted

技术标签:

【中文标题】如何在firebase实时数据库规则中设置变量【英文标题】:How to set a variable in firebase realtime-database rules 【发布时间】:2022-01-05 05:48:15 【问题描述】:

所以我的数据库看起来像这样:

我的规则是这样的:


  "rules": 
    ".read": true,
    ".write": true,
    "_default_user":            <---- this is what I need to change
      "cart":
        ".indexOn": "product/id"
      
    
  

这是我从购物车中删除产品的代码:

removeFromCart(itemRemoved)

    let account = JSON.parse(localStorage.getItem('user')) === null ? '' : JSON.parse(localStorage.getItem('user')).email
    account == '' ?  account = ['_default', ''] : account = /([^@]+)/.exec(account)

    const cartRef = firebase.database().ref('/' + account[0] + '_user' + '/cart');
                               // Do I need to change this ^ as well?

    const itemQuery = cartRef.orderByChild("product/id").equalTo(itemRemoved.id);

    let itemRef:any = ''
    itemQuery.get().then((snapshot) => 
       snapshot.forEach((productSnapshot) => 
          itemRef = firebase.database().ref('/' + account[0] + '_user' + '/cart' + '/' + productSnapshot.key);
       )
    itemRef.remove()
    )

现在,要从购物车中删除商品,我需要手动将帐户添加到我的规则中,这当然是不可行的。 我基本上需要在所有可能的帐户上都有 indexOn,而无需手动执行所有这些操作。

【问题讨论】:

【参考方案1】:

原来我只需要这样做:

    
      "rules": 
        ".read": true,
        ".write": true,
        "$user":                 // <---
          "cart":
            ".indexOn": "product/id"
          
        
      
    

只需输入变量,.indexOn 将应用于根中的每个节点(在我的情况下)

https://firebase.google.com/docs/database/security/core-syntax

【讨论】:

以上是关于如何在firebase实时数据库规则中设置变量的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何在 Firebase 实时数据库中设置作为键值类型的 getter 和 setter?

用户扫描二维码以读取和写入特定数据库节点后如何在 Firebase 中设置安全规则

如何在 Flutter Web 项目中设置 Firebase 功能

Firebase 实时规则

如果用户长时间没有写入,如何使用 Firebase Cloud Functions 在 Firebase 数据库中设置节点的值?

使用 Firebase 实时数据库参考填充 RecyclerView