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

ก่อนที่จะเชื่อมต่อแอปกับโปรแกรมจำลอง 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 ไฟล์

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

เมื่อต้องการทำงานกับฐานข้อมูลเริ่มต้นและฐานข้อมูลที่มีชื่อแบบอินเทอร์แอกทีฟใน Emulator Suite 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 จะทำงานร่วมกันโดยอัตโนมัติ

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

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

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

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

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

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

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

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

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

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

ธุรกรรม

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

ดัชนี

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

จำกัดสูงสุด

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

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

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