使用Firebase规则在Firestore中进行数据验证

时间:2018-09-23 17:57:03

标签: firebase google-cloud-firestore

我的收藏路径是 {Country}/{State}/{ZipCode},如粘贴的图像所示,我在其中存储了一些数据到Firestore中。 enter image description here

我已经在Firestore规则部分编写了一条规则,例如

 service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {   
            allow read;
       allow write: if request.resource.data.Quantity>0;
    }
  }
}

我要使用firestore规则来确保新创建的文档中的“数量”字段为正。因此,我已经写了一条上面显示的规则,但是它没有用。我仍然可以将负值写入firestore。 如何创建规则以确保firestore的“数量”字段下没有负值?

3 个答案:

答案 0 :(得分:1)

如果我没有记错的话,您的规则就会奏效。

我用HTML页面尝试了您的规则,该页面试图编写具有不同Quantity值的文档,请参见下面的代码。在这两种情况下(简单集合或子集合),仅将文档A和D写入数据库(而文档B和C会生成错误)。

规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
      allow write: if request.resource.data.Quantity > 0
    }
  }
}

HTML页面:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <script src="https://www.gstatic.com/firebasejs/5.4.1/firebase-app.js"></script>
    <script src="https://www.gstatic.com/firebasejs/5.4.1/firebase-firestore.js"></script>
</head>

<body>
    <script>
        // Initialize Firebase
        var config = {
            apiKey: ".....",
            authDomain: ".....",
            databaseURL: ".....",
            projectId: "....."
        };

        var db = firebase.firestore();
        var theRef = db.collection('India').doc('Maharashtra').collection('411057');
        theRef.doc("A").set({
            name: "Mumbai",
            Quantity: 1
        });

        theRef.doc("B").set({
            name: "Mumbai",
            Quantity: 0
        });

        theRef.doc("C").set({
            name: "Mumbai",
            Quantity: -2
        });

        theRef.doc("D").set({
            name: "Mumbai",
            Quantity: 2
        });


        var theRef = db.collection('India1');
        theRef.doc("A").set({
            name: "Mumbai",
            Quantity: 1
        });

        theRef.doc("B").set({
            name: "Mumbai",
            Quantity: 0
        });

        theRef.doc("C").set({
            name: "Mumbai",
            Quantity: -2
        });

        theRef.doc("D").set({
            name: "Mumbai",
            Quantity: 2
        });

    </script>

</body>
</html>

答案 1 :(得分:0)

  • 应该检查该字段是否存在

  • 在检查它的整数值之前

  • ,而操作是create(和update):

产生类似这样的规则:

service cloud.firestore {
  match /databases/{database}/documents {

    // match /{document=**} {
    // match /Orders/{document=**} { 
    match /{Country}/{State}/{PostCode}/{document=**} {  
      allow read;
      allow create: if request.resource.data.Quantity != null && int(request.resource.data.Quantity) > 0
      allow update: if request.resource.data.Quantity != null && int(request.resource.data.Quantity) > -1
    }

  }
}

答案 2 :(得分:0)

尝试将文档路径更改为:

service cloud.firestore {
match /databases/{database}/documents {
match /{Country}/{State}/{document=**} {   
allow read;       
allow write: if request.resource.data.Quantity > 0;
}
}
}