Catch up on highlights from Firebase at Google I/O 2023. Learn more

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

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

เลือกโครงการ Firebase

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

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

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

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

โครงการ Firebase จริงคือโครงการที่คุณสร้างและกำหนดค่า (น่าจะผ่านคอนโซล Firebase)

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

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

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

การสาธิต

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

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

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

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

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

เครื่องมือให้แอปของคุณพูดคุยกับผู้เลียนแบบ

แพลตฟอร์ม Android, Apple และ Web SDK

ตั้งค่าการกำหนดค่าในแอปหรือคลาสทดสอบเพื่อโต้ตอบกับ 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 = "localhost: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, 'localhost', 8080);

Web namespaced API

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

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

Admin SDK

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

export FIRESTORE_EMULATOR_HOST="localhost:8080"

หากรหัสของคุณทำงานภายในโปรแกรมจำลอง Cloud Functions รหัสโครงการและการกำหนดค่าอื่นๆ ของคุณจะถูกตั้งค่าโดยอัตโนมัติเมื่อเรียกใช้ initalizeApp

หากต้องการให้โค้ด 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 สำหรับวัตถุประสงค์นี้โดยเฉพาะ ซึ่งสามารถเรียกได้จากการตั้งค่ากรอบการทดสอบ/ขั้นตอนการแยกส่วน จากคลาสทดสอบ หรือจากเชลล์ (เช่น , กับ 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 > คำขอ เพื่อดูลำดับการประเมินโดยละเอียดสำหรับแต่ละคำขอ

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

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

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

ดัชนี

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

ขีด จำกัด

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

อะไรต่อไป?