เชื่อมต่อแอปกับโปรแกรมจำลอง Cloud Firestore

ก่อนที่จะเชื่อมต่อแอปกับโปรแกรมจำลอง Cloud Firestore คุณต้องเข้าใจเวิร์กโฟลว์ Firebase Local Emulator Suite โดยรวม รวมถึงติดตั้งและกำหนดค่า Local Emulator Suite และตรวจสอบคำสั่ง CLI แล้ว

เลือกโปรเจ็กต์ Firebase

Firebase Local Emulator Suite จะจำลองผลิตภัณฑ์สำหรับโปรเจ็กต์ Firebase โปรเจ็กต์เดียว

หากต้องการเลือกโปรเจ็กต์ที่จะใช้ ก่อนที่คุณจะเริ่มโปรแกรมจำลอง ในการเรียกใช้ CLI firebase use ในไดเรกทอรีการทำงาน หรือจะส่งธง --project ไปยังคำสั่งโปรแกรมจำลองแต่ละคำสั่งก็ได้

ชุดโปรแกรมจำลองภายในรองรับการจำลองโปรเจ็กต์ Firebase จริงและโปรเจ็กต์สาธิต

ประเภทโปรเจ็กต์ ฟีเจอร์ ใช้กับโปรแกรมจำลอง
จริง

โปรเจ็กต์ Firebase จริงคือโปรเจ็กต์ที่คุณสร้างและกำหนดค่า (ส่วนใหญ่จะผ่านคอนโซล Firebase)

โปรเจ็กต์จริงจะมีทรัพยากรที่เผยแพร่อยู่ เช่น อินสแตนซ์ฐานข้อมูล ที่เก็บข้อมูลของพื้นที่เก็บข้อมูล ฟังก์ชัน หรือทรัพยากรอื่นๆ ที่คุณตั้งค่าไว้สำหรับโปรเจ็กต์ Firebase นั้น

เมื่อทำงานกับโปรเจ็กต์ Firebase จริง คุณจะเรียกใช้โปรแกรมจำลองสำหรับผลิตภัณฑ์ที่รองรับบางรายการหรือทั้งหมดก็ได้

สำหรับผลิตภัณฑ์ที่คุณไม่ได้จำลอง แอปและโค้ดจะโต้ตอบกับทรัพยากรที่เผยแพร่อยู่ (อินสแตนซ์ฐานข้อมูล ที่เก็บข้อมูลของพื้นที่เก็บข้อมูล ฟังก์ชัน ฯลฯ)

เดโม

โปรเจ็กต์สาธิต Firebase ไม่มีการกำหนดค่า Firebase จริง และไม่มีทรัพยากรที่เผยแพร่อยู่ โดยปกติแล้วโปรเจ็กต์เหล่านี้จะเข้าถึงได้ผ่าน Codelab หรือบทแนะนำอื่นๆ

รหัสโปรเจ็กต์สำหรับโปรเจ็กต์สาธิตจะมี demo- นำหน้า

เมื่อทำงานกับโปรเจ็กต์ Firebase สาธิต แอปและโค้ดจะโต้ตอบกับโปรแกรมจำลองเท่านั้น หากแอปพยายามโต้ตอบกับทรัพยากรที่โปรแกรมจำลองไม่ได้ทำงานอยู่ โค้ดนั้นจะล้มเหลว

เราขอแนะนำให้คุณใช้โปรเจ็กต์เดโมเมื่อเป็นไปได้ สิทธิประโยชน์มีดังนี้

  • ตั้งค่าได้ง่ายขึ้น เนื่องจากคุณเรียกใช้โปรแกรมจำลองได้โดยไม่ต้องสร้างโปรเจ็กต์ Firebase
  • ความปลอดภัยที่แข็งแกร่งขึ้นคือ หากโค้ดของคุณเรียกใช้ทรัพยากรที่ไม่ได้จำลอง (เวอร์ชันที่ใช้งานจริง) โดยไม่ตั้งใจ การเปลี่ยนแปลงข้อมูล การใช้งาน และการเรียกเก็บเงินจะไม่เกิดขึ้น
  • รองรับการใช้งานแบบออฟไลน์ได้ดีกว่า เนื่องจากไม่จำเป็นต้องเข้าถึงอินเทอร์เน็ตเพื่อดาวน์โหลดการกำหนดค่า SDK

ใช้เครื่องดนตรีกับแอปเพื่อพูดคุยกับโปรแกรมจำลอง

เมื่อเริ่มต้นใช้งาน โปรแกรมจำลอง Cloud Firestore จะสร้างฐานข้อมูลเริ่มต้นและฐานข้อมูลที่มีชื่อสำหรับการกำหนดค่า firestore แต่ละรายการในไฟล์ firebase.json

นอกจากนี้ ฐานข้อมูลที่มีชื่อยังสร้างขึ้นโดยปริยายเพื่อตอบสนองต่อการเรียก SDK หรือ REST API ไปยังโปรแกรมจำลองที่อ้างอิงฐานข้อมูลที่เฉพาะเจาะจง ฐานข้อมูลที่สร้างขึ้นโดยนัยดังกล่าวจะทำงานด้วยกฎแบบเปิด

หากต้องการใช้งานฐานข้อมูลเริ่มต้นและฐานข้อมูลที่มีชื่อแบบอินเทอร์แอกทีฟใน UI โปรแกรมจำลอง ให้อัปเดต URL ในแถบที่อยู่ของเบราว์เซอร์เพื่อเลือกฐานข้อมูลเริ่มต้นหรือฐานข้อมูลที่มีชื่อ

  • ตัวอย่างเช่น หากต้องการเรียกดูข้อมูลในอินสแตนซ์เริ่มต้น ให้อัปเดต URL เป็น localhost:4000/firestore/default/data
  • หากต้องการเรียกดูในอินสแตนซ์ชื่อ ecommerce ให้อัปเดตเป็น localhost:4000/firestore/ecommerce/data

Android, แพลตฟอร์ม Apple และเว็บ SDK

ลองกำหนดค่าในแอปหรือคลาสทดสอบเพื่อโต้ตอบกับ Cloud Firestore ดังนี้ โปรดทราบว่าในตัวอย่างต่อไปนี้ โค้ดของแอป กำลังเชื่อมต่อกับฐานข้อมูลโปรเจ็กต์เริ่มต้น ดูตัวอย่างที่เกี่ยวข้องกับฐานข้อมูล Cloud Firestore เพิ่มเติมนอกเหนือจากฐานข้อมูลเริ่มต้นได้ที่คำแนะนำสำหรับฐานข้อมูลหลายรายการ

Kotlin+KTX
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
val firestore = Firebase.firestore
firestore.useEmulator("10.0.2.2", 8080)

firestore.firestoreSettings = firestoreSettings {
    isPersistenceEnabled = false
}
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
firestore.useEmulator("10.0.2.2", 8080);

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(false)
        .build();
firestore.setFirestoreSettings(settings);
Swift
let settings = Firestore.firestore().settings
settings.host = "127.0.0.1:8080"
settings.cacheSettings = MemoryCacheSettings()
settings.isSSLEnabled = false
Firestore.firestore().settings = settings

Web

import { getFirestore, connectFirestoreEmulator } from "firebase/firestore";

// firebaseApps previously initialized using initializeApp()
const db = getFirestore();
connectFirestoreEmulator(db, '127.0.0.1', 8080);

Web

// Firebase previously initialized using firebase.initializeApp().
var db = firebase.firestore();
if (location.hostname === "localhost") {
  db.useEmulator("127.0.0.1", 8080);
}

ไม่ต้องมีการตั้งค่าเพิ่มเติมเพื่อทดสอบ Cloud Functions ที่ทริกเกอร์โดยเหตุการณ์ Firestore โดยใช้โปรแกรมจำลอง เมื่อโปรแกรมจำลอง Firestore และ Cloud Functions ทำงานอยู่ โปรแกรมเหล่านี้จะทำงานร่วมกันโดยอัตโนมัติ

SDK ของผู้ดูแลระบบ

Firebase Admin SDK จะเชื่อมต่อกับโปรแกรมจำลอง Cloud Firestore โดยอัตโนมัติเมื่อตั้งค่าตัวแปรสภาพแวดล้อม FIRESTORE_EMULATOR_HOST ดังนี้

export FIRESTORE_EMULATOR_HOST="127.0.0.1:8080"

หากโค้ดกำลังทำงานภายในโปรแกรมจำลอง Cloud Functions รหัสโปรเจ็กต์และการกำหนดค่าอื่นๆ จะได้รับการตั้งค่าโดยอัตโนมัติเมื่อเรียกใช้ initializeApp

หากต้องการให้โค้ด Admin SDK เชื่อมต่อกับโปรแกรมจำลองที่แชร์ซึ่งทำงานอยู่ในสภาพแวดล้อมอื่น คุณจะต้องระบุรหัสโปรเจ็กต์เดียวกันกับที่ตั้งค่าโดยใช้ Firebase CLI คุณสามารถส่งรหัสโปรเจ็กต์ไปยัง initializeApp โดยตรง หรือตั้งค่าตัวแปรสภาพแวดล้อม GCLOUD_PROJECT ก็ได้

Admin SDK ของ Node.js
admin.initializeApp({ projectId: "your-project-id" });
ตัวแปรสภาพแวดล้อม
export GCLOUD_PROJECT="your-project-id"

ล้างฐานข้อมูลระหว่างการทดสอบ

Firestore เวอร์ชันที่ใช้งานจริงไม่มีเมธอด SDK ของแพลตฟอร์มสำหรับการล้างฐานข้อมูล แต่โปรแกรมจำลอง Firestore มีปลายทาง REST ให้คุณสำหรับวัตถุประสงค์นี้โดยเฉพาะ ซึ่งสามารถเรียกใช้จากการตั้งค่าเฟรมเวิร์กการทดสอบ/ขั้นตอน tearDown จากคลาสการทดสอบ หรือจาก Shell (เช่น ด้วย curl) ก่อนที่จะเริ่มต้นการทดสอบ คุณสามารถใช้วิธีนี้เป็นทางเลือกเพียงแค่ปิดกระบวนการจำลอง

ดำเนินการลบ HTTP ในเมธอดที่เหมาะสมโดยใส่รหัสโปรเจ็กต์ Firebase เช่น firestore-emulator-example ไปยังปลายทางต่อไปนี้

"http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"

โดยปกติแล้ว โค้ดของคุณควรรอการยืนยัน REST ว่าการล้างเสร็จสมบูรณ์แล้วหรือล้มเหลว

คุณสามารถดำเนินการนี้จาก Shell:

// Shell alternative…
$ curl -v -X DELETE "http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"

เมื่อใช้ขั้นตอนเช่นนี้ คุณจะเรียงลำดับการทดสอบและทริกเกอร์ฟังก์ชันได้อย่างมั่นใจว่าข้อมูลเก่าจะถูกลบถาวรระหว่างการเรียกใช้ และคุณกำลังใช้การกำหนดค่าการทดสอบพื้นฐานใหม่

นำเข้าและส่งออกข้อมูล

โปรแกรมจำลองฐานข้อมูลและ Cloud Storage for Firebase ให้คุณส่งออกข้อมูลจากอินสแตนซ์โปรแกรมจำลองที่ทำงานอยู่ได้ กำหนดชุดข้อมูลพื้นฐานที่จะใช้ในการทดสอบหน่วยหรือเวิร์กโฟลว์การผสานรวมอย่างต่อเนื่อง จากนั้นส่งออกเพื่อแชร์ระหว่างทีม

firebase emulators:export ./dir

ในการทดสอบ ให้นำเข้าข้อมูลพื้นฐานเมื่อเริ่มต้นใช้งานโปรแกรมจำลอง

firebase emulators:start --import=./dir

คุณสั่งให้โปรแกรมจำลองส่งออกข้อมูลเมื่อปิดระบบได้ โดยระบุเส้นทางการส่งออกหรือใช้เส้นทางที่ส่งไปยังแฟล็ก --import

firebase emulators:start --import=./dir --export-on-exit

ตัวเลือกการนำเข้าและส่งออกข้อมูลเหล่านี้ใช้งานได้กับคำสั่ง firebase emulators:exec ด้วยเช่นกัน ดูข้อมูลเพิ่มเติมได้ที่การอ้างอิงคำสั่งโปรแกรมจำลอง

แสดงภาพกิจกรรมของกฎการรักษาความปลอดภัย

ขณะสร้างต้นแบบและลูปการทดสอบ คุณใช้เครื่องมือสร้างการแสดงข้อมูลและรายงานจาก Local Emulator Suite ได้

ใช้การตรวจสอบคำขอ

โปรแกรมจำลอง Cloud Firestore ช่วยให้คุณเห็นภาพคำขอของไคลเอ็นต์ใน UI ของ Emulator Suite รวมถึงการติดตามกฎการรักษาความปลอดภัยของ Firebase ได้

เปิดแท็บ Firestore > คำขอเพื่อดูลำดับการประเมินโดยละเอียดสำหรับคำขอแต่ละรายการ

การตรวจสอบคำขอโปรแกรมจำลอง Firestore ที่แสดงการประเมินกฎความปลอดภัย

แสดงภาพรายงานการประเมินกฎ

ขณะที่เพิ่มกฎความปลอดภัยลงในต้นแบบ คุณจะแก้ไขข้อบกพร่องได้ด้วยเครื่องมือแก้ไขข้อบกพร่องของชุดโปรแกรมจำลองภายใน

หลังจากใช้งานชุดการทดสอบแล้ว คุณจะเข้าถึงรายงานการครอบคลุมของการทดสอบที่แสดงวิธีประเมินกฎความปลอดภัยแต่ละข้อได้

หากต้องการดูรายงาน ให้ค้นหาปลายทางที่เปิดเผยในโปรแกรมจำลองขณะทำงานอยู่ สำหรับเวอร์ชันที่เหมาะสำหรับเบราว์เซอร์ ให้ใช้ URL ต่อไปนี้:

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html

ซึ่งจะแบ่งกฎออกเป็นนิพจน์และนิพจน์ย่อยที่คุณวางเมาส์เหนือเพื่อดูข้อมูลเพิ่มเติม รวมถึงจำนวนการประเมินและค่าที่แสดงผลได้ สำหรับเวอร์ชันข้อมูลดิบ JSON ของข้อมูลนี้ ให้ใส่ URL ต่อไปนี้ในการค้นหา

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage

ในส่วนนี้ รายงานเวอร์ชัน HTML จะไฮไลต์การประเมินที่ทำให้เกิดข้อผิดพลาดที่ไม่ได้ระบุและเป็นค่าว่าง

โปรแกรมจำลอง Cloud Firestore ต่างจากเวอร์ชันที่ใช้งานจริงอย่างไร

โปรแกรมจำลอง Cloud Firestore จะพยายามจำลองลักษณะการทำงานของบริการเวอร์ชันที่ใช้งานจริงอย่างจริงใจโดยมีข้อจำกัดที่สำคัญบางประการ

การรองรับฐานข้อมูลหลายรายการสำหรับ Cloud Firestore

ปัจจุบัน UI ชุดโปรแกรมจำลองรองรับการสร้าง การแก้ไข การลบ การตรวจสอบคำขอ และการแสดงภาพความปลอดภัยแบบอินเทอร์แอกทีฟสำหรับฐานข้อมูลเริ่มต้น แต่ไม่รวมถึงฐานข้อมูลที่มีชื่อเพิ่มเติม

แต่ตัวจำลองจะสร้างฐานข้อมูลที่มีชื่อตามการกำหนดค่าในไฟล์ firebase.json และตอบสนองการเรียก SDK หรือ REST API โดยปริยาย

ธุรกรรม

ขณะนี้โปรแกรมจําลองไม่ได้ใช้ลักษณะธุรกรรมทั้งหมดที่เห็นในเวอร์ชันที่ใช้งานจริง เมื่อคุณทดสอบฟีเจอร์ที่เกี่ยวข้องกับการเขียนหลายรายการพร้อมกันในเอกสารเดียว โปรแกรมจำลองอาจดำเนินการตามคำขอเขียนได้ช้า ในบางกรณี การล็อกอาจใช้เวลาถึง 30 วินาทีจึงจะปล่อยได้ พิจารณาปรับระยะหมดเวลาของการทดสอบตามความเหมาะสม หากจำเป็น

ดัชนี

โปรแกรมจำลองจะไม่ติดตามดัชนีผสม และจะเรียกใช้การค้นหาที่ถูกต้องแทน อย่าลืมทดสอบแอปกับอินสแตนซ์ Cloud Firestore จริงเพื่อดูว่าจะต้องใช้ดัชนีใด

จำกัดสูงสุด

โปรแกรมจำลองไม่ได้บังคับใช้ขีดจำกัดทั้งหมดที่บังคับใช้ในเวอร์ชันที่ใช้งานจริง เช่น โปรแกรมจำลองอาจอนุญาตให้มีธุรกรรมที่บริการที่ใช้งานจริงถูกปฏิเสธมีขนาดใหญ่เกินไป อย่าลืมทำความเข้าใจขีดจำกัดที่บันทึกไว้ และออกแบบแอปเพื่อหลีกเลี่ยงการละเมิดในเชิงรุก

ฉันควรทำอย่างไรต่อไป

  • หากต้องการดูชุดวิดีโอที่มีการดูแลจัดการและตัวอย่างวิธีการโดยละเอียด ให้ทำตามเพลย์ลิสต์การฝึกอบรมของ Firebase Emulators
  • ตรวจสอบกรณีการใช้งานขั้นสูงที่เกี่ยวข้องกับการทดสอบกฎความปลอดภัยและ Firebase Test SDK: Test Security Rules (Firestore)
  • เนื่องจากฟังก์ชันที่ทริกเกอร์เป็นการผสานรวมกับ Cloud Firestore ตามปกติ โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับโปรแกรมจำลอง Cloud Functions for Firebase ที่เรียกใช้ฟังก์ชันในเครื่อง