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

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

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

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

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

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

ใช้เครื่องมือในแอปเพื่อสื่อสารกับโปรแกรมจำลอง

ใช้เครื่องมือในแอปสำหรับฟังก์ชันที่เรียกใช้ได้

หากกิจกรรมการสร้างต้นแบบและการทดสอบเกี่ยวข้องกับฟังก์ชันแบ็กเอนด์ที่เรียกใช้ได้ ให้กำหนดค่าการโต้ตอบกับโปรแกรมจำลอง Cloud Functions for Firebase ดังนี้

Kotlin
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
val functions = Firebase.functions
functions.useEmulator("10.0.2.2", 5001)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFunctions functions = FirebaseFunctions.getInstance();
functions.useEmulator("10.0.2.2", 5001);
Swift
Functions.functions().useEmulator(withHost: "localhost", port: 5001)
Unity
FirebaseFunctions functions = FirebaseFunctions.DefaultInstance;
// Connects to the Functions Emulator running on port 5001
functions.UseFunctionsEmulator("http://127.0.0.1:5001");

Web

import { getApp } from "firebase/app";
import { getFunctions, connectFunctionsEmulator } from "firebase/functions";

const functions = getFunctions(getApp());
connectFunctionsEmulator(functions, "127.0.0.1", 5001);

Web

firebase.functions().useEmulator("127.0.0.1", 5001);

ติดตั้งเครื่องมือในแอปเพื่อจำลองฟังก์ชัน HTTPS

ระบบจะแสดงฟังก์ชัน HTTPS แต่ละรายการในโค้ดของคุณจากโปรแกรมจำลองในเครื่องโดยใช้รูปแบบ URL ต่อไปนี้

http://$HOST:$PORT/$PROJECT/$REGION/$NAME

ตัวอย่างเช่น ฟังก์ชัน helloWorld แบบง่ายที่มีพอร์ตโฮสต์และภูมิภาคเริ่มต้นจะแสดงที่:

https://localhost:5001/$PROJECT/us-central1/helloWorld

ใช้เครื่องมือวัดแอปเพื่อจำลองฟังก์ชันคิวงาน

โปรแกรมจำลองจะตั้งค่าคิวงานที่จำลองขึ้นโดยอัตโนมัติตามคำจำกัดความของทริกเกอร์ และ Admin SDK จะเปลี่ยนเส้นทางคำขอที่อยู่ในคิวไปยังโปรแกรมจำลองหากตรวจพบว่ากำลังทำงานผ่านตัวแปรสภาพแวดล้อม CLOUD_TASKS_EMULATOR_HOST

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

ติดตั้งเครื่องมือในแอปเพื่อจำลองฟังก์ชันที่ทริกเกอร์ในเบื้องหลัง

โปรแกรมจำลอง Cloud Functions รองรับฟังก์ชันที่ทริกเกอร์ในเบื้องหลังซึ่งมาจากแหล่งที่มาต่อไปนี้

  • โปรแกรมจำลอง Realtime Database
  • โปรแกรมจำลอง Cloud Firestore
  • โปรแกรมจำลอง Authentication
  • โปรแกรมจำลอง Pub/Sub
  • โปรแกรมจำลองการแจ้งเตือนของ Firebase

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

ตัวแฮนเดิลการทดสอบสำหรับเหตุการณ์ที่กำหนดเองซึ่งส่งโดยส่วนขยาย

สำหรับฟังก์ชันที่คุณใช้เพื่อจัดการเหตุการณ์ที่กำหนดเองของ Firebase Extensions ด้วย Cloud Functions v2 โปรแกรมจำลอง Cloud Functions จะจับคู่กับโปรแกรมจำลอง Eventarc เพื่อรองรับทริกเกอร์ Eventarc

หากต้องการทดสอบเครื่องจัดการเหตุการณ์ที่กำหนดเองสำหรับส่วนขยายที่ส่งเหตุการณ์ คุณต้องติดตั้งโปรแกรมจำลอง Cloud Functions และ Eventarc

รันไทม์ Cloud Functions จะตั้งค่าตัวแปรสภาพแวดล้อม EVENTARC_EMULATOR เป็น localhost:9299 ในกระบวนการปัจจุบันหากโปรแกรมจำลอง Eventarc ทำงานอยู่ Firebase Admin SDK จะเชื่อมต่อกับโปรแกรมจำลอง Eventarc โดยอัตโนมัติเมื่อตั้งค่าตัวแปรสภาพแวดล้อม EVENTARC_EMULATOR คุณสามารถแก้ไขพอร์ตเริ่มต้นได้ตามที่อธิบายไว้ในหัวข้อกำหนดค่า Local Emulator Suite

เมื่อกำหนดค่าตัวแปรสภาพแวดล้อมอย่างถูกต้องแล้ว Firebase Admin SDK จะส่งเหตุการณ์ไปยังโปรแกรมจำลอง Eventarc โดยอัตโนมัติ ในทางกลับกัน โปรแกรมจำลอง Eventarc จะโทรกลับไปยังโปรแกรมจำลอง Cloud Functions เพื่อเรียกใช้แฮนเดิลที่ลงทะเบียนไว้

คุณสามารถตรวจสอบบันทึกของ Functions ใน Emulator Suite UI เพื่อดูรายละเอียดเกี่ยวกับการดำเนินการของเครื่องจัดการ

กำหนดค่าสภาพแวดล้อมการทดสอบในเครื่อง

หากฟังก์ชันของคุณอาศัยการกำหนดค่าสภาพแวดล้อมที่อิงตาม dotenv คุณสามารถจำลองลักษณะการทำงานดังกล่าวในสภาพแวดล้อมการทดสอบในเครื่องได้

เมื่อใช้โปรแกรมจำลอง Cloud Functions ในเครื่อง คุณสามารถลบล้างตัวแปรสภาพแวดล้อมสำหรับโปรเจ็กต์ได้โดยการตั้งค่าไฟล์ .env.local เนื้อหาของ .env.local มีความสำคัญเหนือกว่า .env และไฟล์ .env เฉพาะโปรเจ็กต์

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

.env .env.dev .env.local
PLANET=Earth

AUDIENCE=Humans

AUDIENCE=Dev Humans AUDIENCE=Local Humans

เมื่อเริ่มต้นในบริบทเฉพาะรายการ โปรแกรมจำลองจะโหลดตัวแปรสภาพแวดล้อมดังที่แสดงต่อไปนี้

  $ firebase emulators:start
  i  emulators: Starting emulators: functions
  # Starts emulator with following environment variables:
  #  PLANET=Earth
  #  AUDIENCE=Local Humans

ข้อมูลลับและข้อมูลเข้าสู่ระบบในโปรแกรมจำลอง Cloud Functions

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

คุณสามารถลบล้างค่าข้อมูลลับได้โดยการตั้งค่าไฟล์ .secret.local ซึ่งคล้ายกับการรองรับตัวแปรสภาพแวดล้อมของโปรแกรมจำลอง Cloud Functions ซึ่งจะช่วยให้คุณทดสอบฟังก์ชันในเครื่องได้ง่าย โดยเฉพาะอย่างยิ่งหากคุณไม่มีสิทธิ์เข้าถึงค่าข้อมูลลับ

มีเครื่องมืออื่นๆ อะไรบ้างสำหรับการทดสอบ Cloud Functions

โปรแกรมจำลอง Cloud Functions มีเครื่องมือสร้างต้นแบบและการทดสอบอื่นๆ เสริมด้วย ดังนี้

  • เชลล์ Cloud Functions ซึ่งช่วยให้สร้างต้นแบบและพัฒนาฟังก์ชันแบบอินเทอร์แอกทีฟและทำซ้ำได้ เชลล์ใช้โปรแกรมจำลอง Cloud Functions กับอินเทอร์เฟซสไตล์ REPL สำหรับการพัฒนา ไม่มีการผสานรวมกับโปรแกรมจำลอง Cloud Firestore หรือ Realtime Database คุณสามารถใช้ Shell เพื่อจำลองข้อมูลและเรียกใช้ฟังก์ชันเพื่อจำลองการโต้ตอบกับผลิตภัณฑ์ที่ Local Emulator Suite ยังไม่รองรับในปัจจุบัน ซึ่งได้แก่ Analytics, Remote Config และ Crashlytics
  • Firebase Test SDK สำหรับ Cloud Functions, Node.js ที่มีเฟรมเวิร์ก Mocha สำหรับการพัฒนาฟังก์ชัน โดยพื้นฐานแล้ว SDK ทดสอบของ Cloud Functions จะให้ระบบอัตโนมัติที่ทำงานบนเชลล์ของ Cloud Functions

ดูข้อมูลเพิ่มเติมเกี่ยวกับเชลล์ Cloud Functions และ SDK การทดสอบ Cloud Functions ได้ที่ทดสอบฟังก์ชันแบบอินเทอร์แอกทีฟและการทำ Unit Test ของ Cloud Functions

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

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

Cloud IAM

Firebase Emulator Suite ไม่พยายามจำลองหรือปฏิบัติตามพฤติกรรมที่เกี่ยวข้องกับ IAM สำหรับการเรียกใช้ โปรแกรมจำลองจะปฏิบัติตามกฎความปลอดภัยของ Firebase ที่ระบุไว้ แต่ในสถานการณ์ที่ปกติจะใช้ IAM เช่น เพื่อตั้งค่าบัญชีบริการที่เรียกใช้ Cloud Functions และสิทธิ์ โปรแกรมจำลองจะกำหนดค่าไม่ได้และจะใช้บัญชีที่ใช้ได้ทั่วโลกในคอมพิวเตอร์สำหรับการพัฒนาซอฟต์แวร์ของคุณ ซึ่งคล้ายกับการเรียกใช้สคริปต์ในเครื่องโดยตรง

ข้อจำกัดด้านหน่วยความจำและโปรเซสเซอร์

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

โปรดทราบว่าเวลาในการเรียกใช้ฟังก์ชันอาจแตกต่างจากเวอร์ชันที่ใช้งานจริงเมื่อเรียกใช้ฟังก์ชันในโปรแกรมจำลอง เราขอแนะนำว่าหลังจากออกแบบและทดสอบฟังก์ชันด้วยโปรแกรมจำลองแล้ว ให้ทำการทดสอบแบบจำกัดในเวอร์ชันที่ใช้งานจริงเพื่อยืนยันเวลาในการดำเนินการ

การวางแผนสำหรับความแตกต่างในสภาพแวดล้อมฮาร์ดแวร์และซอฟต์แวร์ในเครื่องและเวอร์ชันที่ใช้งานจริง

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

โปรดทราบว่าสภาพแวดล้อมในเครื่องสำหรับการพัฒนา Cloud Functions อาจแตกต่างจากสภาพแวดล้อมฮาร์ดแวร์และซอฟต์แวร์ที่ใช้งานจริงของ Google ดังนี้

  • แอปพลิเคชันที่คุณติดตั้งในเครื่องเพื่อจำลองสภาพแวดล้อมฮาร์ดแวร์และซอฟต์แวร์ (เช่น ImageMagick จากบทแนะนำนี้) อาจมีลักษณะการทำงานแตกต่างจากเวอร์ชันที่ใช้งานจริง โดยเฉพาะอย่างยิ่งหากคุณต้องการเวอร์ชันอื่นหรือพัฒนาในสภาพแวดล้อมที่ไม่ใช่ Linux ลองติดตั้งใช้งานสำเนาไบนารีของคุณเองของโปรแกรมที่ขาดหายไปควบคู่กับการติดตั้งใช้งานฟังก์ชัน

  • ในทำนองเดียวกัน ยูทิลิตีในตัว (เช่น คำสั่ง Shell อย่าง ls, mkdir) อาจแตกต่างจากเวอร์ชันที่พร้อมใช้งานในเวอร์ชันที่ใช้งานจริง โดยเฉพาะอย่างยิ่งหากคุณกำลังพัฒนาในสภาพแวดล้อมที่ไม่ใช่ Linux (เช่น macOS) คุณสามารถจัดการปัญหานี้ได้โดยใช้ทางเลือกเฉพาะ Node สำหรับคำสั่งแบบเนทีฟ หรือโดยการสร้างไบนารี Linux เพื่อรวมเข้ากับการติดตั้งใช้งาน

กำลังลองอีกครั้ง

โปรแกรมจำลอง Cloud Functions ไม่รองรับการลองใช้ฟังก์ชันอีกครั้งเมื่อดำเนินการไม่สำเร็จ

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