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

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

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

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

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

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

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

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

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

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

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

เดโม

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

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

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

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

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

เครื่องมือวัดผลแอปเพื่อพูดคุยกับโปรแกรมจำลอง

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

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

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 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().useFunctionsEmulator(origin: "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 emulator
  • Cloud Firestore emulator
  • Authentication emulator
  • Pub/Sub emulator
  • โปรแกรมจำลองการแจ้งเตือนของ 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 เพื่อเรียกใช้ตัวแฮนเดิลที่ลงทะเบียนไว้

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

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

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

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

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

Cloud IAM

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

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

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

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

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

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

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

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

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

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

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

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