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

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

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

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

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

Local Emulator Suite รองรับการจําลองโปรเจ็กต์ Firebase จริงและโปรเจ็กต์สาธิต

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

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

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

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

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

เดโม

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

รหัสโปรเจ็กต์ของโปรเจ็กต์เดโมจะมีคำนำหน้า demo-

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

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

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

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

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

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

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

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

แพลตฟอร์ม Android, Apple และ Web 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 ทำงานอยู่ด้วยกัน โปรแกรมจำลองจะทำงานร่วมกันโดยอัตโนมัติ

Admin 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

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

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

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

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

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

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

คุณดำเนินการนี้ได้จากเชลล์

// 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

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

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

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

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

ขณะทํางานกับต้นแบบและทดสอบลูป คุณสามารถใช้เครื่องมือแสดงภาพและรายงานที่ Local Emulator Suite มีให้

ใช้เครื่องมือตรวจสอบคำขอ

โปรแกรมจำลอง Cloud Firestore ช่วยให้คุณเห็นภาพคําขอของลูกค้าใน Emulator Suite UI รวมถึงการติดตามการประเมินสําหรับ Firebase Security Rules

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ธุรกรรม

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

ดัชนี

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

จำกัดสูงสุด

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

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