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

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

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

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

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

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

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

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

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

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

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

ข้อมูลประชากร

โปรเจ็กต์ 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 และ 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 Modular API

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

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

API เว็บเนมสเปซ

// 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 ของผู้ดูแลระบบ

SDK ของผู้ดูแลระบบ Firebase จะเชื่อมต่อกับโปรแกรมจำลอง 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"

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

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

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

ระหว่างที่สร้างต้นแบบและ Test Loop คุณจะใช้เครื่องมือการแสดงข้อมูลผ่านภาพและรายงานจากชุดโปรแกรมจำลอง Local ได้

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

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

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

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

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

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

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

ธุรกรรม

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

ดัชนี

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

ขีดจำกัด

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

แล้วยังไงต่อดี

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