Cloud Firestore และ Realtime Database ต่างก็อาศัยภาษากฎที่มีประสิทธิภาพและกระชับซึ่งสร้างขึ้นโดยเฉพาะเพื่อควบคุมความปลอดภัยของข้อมูลและการควบคุมการเข้าถึง อย่างไรก็ตาม เนื่องจากกฎมีความยาวและซับซ้อนมากขึ้น คุณอาจต้องการความช่วยเหลือในการแก้ไขข้อผิดพลาดในลักษณะการทำงาน
Firebase Emulators มีความสามารถในการสร้างรายงานความครอบคลุมของกฎ ดังนั้นคุณจึงสามารถดูได้อย่างแน่ชัดว่านิพจน์ย่อยแต่ละนิพจน์ประเมินเป็นอย่างไรเมื่อคุณสร้างข้อผิดพลาดขึ้นมาใหม่ รายงานยังให้ข้อมูลว่ากรณีทดสอบแต่ละกรณีใช้กฎบ่อยเพียงใด เช่น เทคนิค "การครอบคลุมบรรทัด" แบบดั้งเดิม
สร้างรายงาน
หลังจากเรียกใช้ชุดการทดสอบ คุณจะสามารถเข้าถึงรายงานความครอบคลุมของการทดสอบที่แสดงให้เห็นว่ากฎความปลอดภัยแต่ละข้อของคุณได้รับการประเมินอย่างไร
หากต้องการรับรายงาน ให้ค้นหาปลายทางที่เปิดเผยบนโปรแกรมจำลองขณะที่เครื่องกำลังทำงานอยู่ สำหรับเวอร์ชันที่เหมาะกับเบราว์เซอร์ ให้ใช้ URL ต่อไปนี้:
คลาวด์ไฟร์สโตร์
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
ฐานข้อมูลเรียลไทม์
http://localhost:9000/.inspect/coverage?ns=<database_name>
ซึ่งจะแบ่งกฎของคุณเป็นนิพจน์และนิพจน์ย่อยที่คุณสามารถวางเมาส์ไว้เพื่อดูข้อมูลเพิ่มเติม รวมถึงจำนวนการประเมินและค่าที่ส่งคืน สำหรับข้อมูลเวอร์ชัน JSON แบบดิบ ให้รวม URL ต่อไปนี้ในการสืบค้นของคุณ:
คลาวด์ไฟร์สโตร์
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage
ฐานข้อมูลเรียลไทม์
http://localhost:9000/.inspect/coverage.json?ns=<database_name>
การแก้ไขกฎตัวอย่าง
หากต้องการสร้างรายงานการทดสอบอย่างง่ายดาย ให้ใช้โปรแกรมจำลองการเริ่มต้นอย่างรวดเร็วซึ่งมีอยู่บน GitHub สำหรับ Cloud Firestore และ Realtime Database การเริ่มต้นอย่างรวดเร็วเหล่านี้จะแนะนำคุณในการติดตั้งและเริ่มต้นโปรแกรมจำลองอย่างเหมาะสม จากนั้นสร้างการทดสอบตัวอย่างจากชุดกฎตัวอย่าง
ลองพิจารณาแอปตัวอย่างที่ใช้ Cloud Firestore ซึ่งนับจำนวนครั้งที่ผู้ใช้คลิกปุ่ม แอปใช้กฎต่อไปนี้:
คลาวด์ไฟร์สโตร์
service cloud.firestore { match /databases/{database}/documents { match /counters/{counter} { allow read; allow write: if request.resource.data.value == resource.data.value +1; } } }
หากต้องการแก้ไขข้อผิดพลาดในกฎที่แสดงด้านบน ให้ใช้การทดสอบ JavaScript ตัวอย่างต่อไปนี้:
const counter0 = db.collection("counters").doc("0");
await firebase.assertSucceeds(counter0.set({value: 0}));
โปรแกรมจำลองสร้างรายงานตาม URL ที่ระบุไว้ข้างต้น:
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
รายงานแสดงข้อผิดพลาดที่ไม่ได้กำหนดและค่า Null ต่อไปนี้:
ปัญหาของตัวอย่างเฉพาะนี้คือกฎไม่แยกความแตกต่างระหว่างการสร้างเอกสารและการอัปเดตเอกสาร ด้วยเหตุนี้ จึงไม่อนุญาตให้เขียนหากไม่มีเอกสาร และไม่สามารถสร้างเอกสารได้เนื่องจากไม่มีเอกสารอยู่ การแยกความแตกต่างระหว่าง "การเขียน" ออกเป็นสองการดำเนินการที่เฉพาะเจาะจงมากขึ้น - "สร้าง" และ "อัปเดต" - ช่วยแก้ปัญหาได้
คลาวด์ไฟร์สโตร์
service cloud.firestore { match /databases/{database}/documents { match /counters/{counter} { allow read; allow create: if request.resource.data.value == 0; allow update: if request.resource.data.value == resource.data.value +1; } } }
รายงานที่สร้างขึ้นจะแสดงความถี่ที่ใช้แต่ละกฎและสิ่งที่ส่งคืน