เชื่อมต่อแอปของคุณกับ Cloud Firestore Emulator

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

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

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

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

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

ประเภทโครงการ คุณสมบัติ ใช้กับโปรแกรมจำลอง
จริง

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

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

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

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

การสาธิต

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

รหัสโครงการสำหรับโครงการสาธิตต้องมีคำนำหน้า demo-

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

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

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

ติดตั้งแอปของคุณเพื่อพูดคุยกับอีมูเลเตอร์

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

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

ปัจจุบัน Emulator Suite UI รองรับการทำงานแบบโต้ตอบกับ ฐานข้อมูลเริ่มต้น

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);
สวิฟท์
let settings = Firestore.firestore().settings
settings.host = "127.0.0.1:8080"
settings.isPersistenceEnabled = false
settings.isSSLEnabled = false
Firestore.firestore().settings = settings

Web modular API

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

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

Web namespaced API

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

ไม่จำเป็นต้องตั้งค่าเพิ่มเติมเพื่อทดสอบฟังก์ชันคลาวด์ ที่ทริกเกอร์โดยเหตุการณ์ 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

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

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

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

ในวิธีการที่เหมาะสม ให้ดำเนินการ HTTP DELETE โดยระบุ Firebase projectID ของคุณ เช่น 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 สำหรับโปรแกรมจำลอง 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 ช่วยให้คุณเห็นภาพคำขอไคลเอ็นต์ใน Emulator Suite UI รวมถึงการติดตามการประเมินสำหรับกฎความปลอดภัยของ Firebase

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

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

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

เมื่อคุณเพิ่มกฎความปลอดภัยลงในต้นแบบ คุณสามารถแก้ไขข้อบกพร่องเหล่านั้นได้ด้วยเครื่องมือแก้ไขข้อบกพร่อง 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 Firestore Emulator พยายามจำลองพฤติกรรมของบริการที่ใช้งานจริงอย่างซื่อสัตย์โดยมีข้อจำกัดบางประการที่น่าสังเกต

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

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

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

การทำธุรกรรม

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

ดัชนี

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

ขีดจำกัด

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

อะไรต่อไป?

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