เมื่อใช้ Cloud Functions (รุ่นที่ 2) คุณจะทริกเกอร์ฟังก์ชันเพื่อตอบสนองต่อเหตุการณ์ที่กําหนดเองได้ เหตุการณ์เหล่านี้มาจากผู้ให้บริการเหตุการณ์พิเศษหรือเพิ่มเติม ซึ่งต่างจากเหตุการณ์ Firebase ที่ Firebase SDK สําหรับ Cloud Functions รองรับโดยค่าเริ่มต้น แอปของคุณสามารถตอบสนองต่อเหตุการณ์ที่ให้บริการโดย Firebase Extensions หรือคุณจะเผยแพร่แบบกำหนดเองก็ได้ และทริกเกอร์ฟังก์ชันต่างๆ ให้ตอบสนอง
เหตุการณ์ที่กําหนดเองทั้งหมดต้องเป็นไปตามรูปแบบเหตุการณ์ JSON ของ CloudEvents และเผยแพร่ไปยัง Eventarc Eventarc ค่าธรรมเนียมการใช้งาน
ทริกเกอร์ทำงานกับเหตุการณ์ที่กำหนดเอง
คุณสามารถเผยแพร่เหตุการณ์ที่กําหนดเอง (หรือรับเหตุการณ์จากส่วนขยาย Firebase) และเรียกใช้ฟังก์ชันเพื่อตอบสนองต่อเหตุการณ์เหล่านั้นได้โดยทําตามขั้นตอนพื้นฐานต่อไปนี้
- เผยแพร่กิจกรรมที่ต้องการไปยังช่องทาง Eventarc หรือระบุว่ามี ที่มาจากส่วนขยายที่คุณติดตั้ง
- ในโค้ดฟังก์ชัน ให้สมัครรับเหตุการณ์ในช่อง Eventarc ด้วยเครื่องจัดการเหตุการณ์
- ในฟังก์ชัน ให้แยกวิเคราะห์เพย์โหลดที่แสดงผลใน CloudEvent และดำเนินการลอจิกที่กำหนดเองซึ่งแอปของคุณต้องการ
เช่น แอปเกมอาจต้องการส่งการแจ้งเตือนไปยังผู้ใช้เมื่อเข้าสู่หรือออกจากตารางอันดับของคู่แข่ง 10 อันดับแรก แอปนี้สามารถเผยแพร่ได้ ลีดเดอร์บอร์ดเป็นช่องเริ่มต้น แล้วจัดการเหตุการณ์ใน ที่ส่งข้อความ Push เป้าหมายไปยังผู้ใช้
อีกตัวอย่างหนึ่งคือ ส่วนขยายที่ออกแบบมาเพื่อช่วยแอปประมวลผลรูปภาพขนาดใหญ่อาจส่งเหตุการณ์เมื่อการปรับขนาดรูปภาพเสร็จสมบูรณ์ แอปที่ติดตั้งส่วนขยายนี้จะจัดการเหตุการณ์เสร็จสมบูรณ์ได้โดยอัปเดตลิงก์ในแอปให้ชี้ไปยังรูปภาพเวอร์ชันที่ปรับขนาดแล้ว
เผยแพร่กิจกรรมลงในช่อง
ระบบจะเผยแพร่เหตุการณ์ Eventarc ไปยังแชแนล
แชแนลเป็นวิธีจัดกลุ่มเหตุการณ์ที่เกี่ยวข้องและจัดการสิทธิ์เข้าถึง เมื่อคุณติดตั้งส่วนขยายหรือทําให้ฟังก์ชันใช้เหตุการณ์ที่กําหนดเอง Firebase จะสร้างแชแนลเริ่มต้นชื่อ firebase
โดยอัตโนมัติในภูมิภาค us-central1
Firebase Admin SDK มีeventarc
แพ็กเกจย่อยสําหรับเผยแพร่ไปยังช่อง
วิธีเผยแพร่เหตุการณ์จากเซิร์ฟเวอร์ที่เชื่อถือได้ (หรือฟังก์ชันอื่น) โดยใช้แชแนลเริ่มต้น
import {getEventarc} from 'firebase-admin/eventarc';
getEventarc().channel().publish({
type: 'achieved-leaderboard',
subject: 'Welcome to the top 10',
data: {
message: 'You have achieved the nth position in our leaderboard! To see . . .'
}
});
นอกจากการสร้างแชแนลเริ่มต้นโดยอัตโนมัติแล้ว Firebase ยังตั้งค่า
ตัวแปรสภาพแวดล้อม EVENTARC_CLOUD_EVENT_SOURCE
ซึ่งระบุแหล่งที่มา
ของเหตุการณ์ หากคุณเผยแพร่กิจกรรมภายนอก Cloud Functions for Firebase
คุณจะต้องเพิ่มช่อง source
ในเพย์โหลดเหตุการณ์อย่างชัดเจน
จัดการเหตุการณ์ที่กําหนดเอง
คุณสามารถจัดการเหตุการณ์ที่กําหนดเองทั้งหมด รวมถึงเหตุการณ์ส่วนขยายได้ด้วยตัวแฮนเดิล onCustomEventPublished
หรือ on_custom_event_published
ก่อนอื่น ให้นําเข้าตัวแฮนเดิลนี้จาก Eventarc SDK พร้อมกับ Firebase Admin SDK
Node.js
const {onCustomEventPublished} = require("firebase-functions/v2/eventarc");
const logger = require("firebase-functions/logger");
const {initializeApp} = require("firebase-admin/app");
const {getFirestore} = require("firebase-admin/firestore");
Python
from firebase_admin import firestore, initialize_app
from firebase_functions import eventarc_fn
ในโค้ดฟังก์ชัน ให้ส่งชื่อเหตุการณ์ตามที่แสดงในฟังก์ชันตัวอย่างต่อไปนี้
Node.js
exports.onimageresized = onCustomEventPublished(
"firebase.extensions.storage-resize-images.v1.complete",
(event) => {
logger.info("Received image resize completed event", event);
// For example, write resized image details into Firestore.
return getFirestore()
.collection("images")
.doc(event.subject.replace("/", "_")) // original file path
.set(event.data); // resized images paths and sizes
});
Python
@eventarc_fn.on_custom_event_published(
event_type="firebase.extensions.storage-resize-images.v1.complete")
def onimageresized(event: eventarc_fn.CloudEvent) -> None:
print("Received image resize completed event: ", event.type)
if not isinstance(event.subject, str):
print("No 'subject' data.")
return
# For example, write resized image details into Firestore.
firestore_client: google.cloud.firestore.Client = firestore.client()
collection = firestore_client.collection("images")
doc = collection.document(event.subject.replace("/", "_")) # original file path
doc.set(event.data) # resized images paths and sizes
สำหรับส่วนขยายเฉพาะแต่ละรายการ เพย์โหลดที่แสดงผลในออบเจ็กต์เหตุการณ์จะให้
ข้อมูลที่คุณสามารถใช้เพื่อดำเนินการตรรกะที่กำหนดเองสำหรับโฟลว์แอปพลิเคชันของคุณ ในกรณีนี้ ฟังก์ชันจะใช้ Admin SDK เพื่อคัดลอกข้อมูลเมตาเกี่ยวกับรูปภาพที่ปรับขนาดแล้วไปยังคอลเล็กชันใน Cloud Firestore โดยรับชื่อไฟล์จาก subject
ที่เหตุการณ์ระบุ และบันทึกข้อมูลเมตาจาก data
ที่เหตุการณ์ระบุ
เผยแพร่และจัดการเหตุการณ์ในช่องทางที่ไม่ใช่ช่องทางเริ่มต้น
แชแนลที่กำหนดเองจะมีประโยชน์ในกรณีที่คุณต้องการสิทธิ์พิเศษหรือข้อกำหนดอื่นๆ และไม่ต้องการให้กิจกรรมทั้งหมดมีระดับการเข้าถึงและการแชร์ข้อมูลเดียวกัน คุณสามารถสร้างแชแนลของคุณเองได้โดยใช้คอนโซล Google Cloud การเผยแพร่และการติดตามกิจกรรมต้องดำเนินการในช่องเดียวกัน
ในกรณีที่มีการเผยแพร่เหตุการณ์ที่กำหนดเองในช่องที่ไม่ใช่ค่าเริ่มต้น
คุณจะต้องระบุแชแนลในโค้ดฟังก์ชัน ตัวอย่างเช่น หากต้องการจัดการเหตุการณ์ที่เผยแพร่ในช่องทางที่ไม่ใช่ช่องทางเริ่มต้นสําหรับสถานที่ us-west1
คุณจะต้องระบุช่องทางดังที่แสดง
Node.js
import { onCustomEventPublished } from "firebase-functions/v2/eventarc";
export const func = onCustomEventPublished(
{
eventType: "firebase.extensions.storage-resize-images.v1.complete",
channel: "locations/us-west1/channels/firebase",
region: "us-west1",
},
(event) => { ... });
Python
@eventarc_fn.on_custom_event_published(
event_type="firebase.extensions.storage-resize-images.v1.complete",
channel="locations/us-west1/channels/firebase",
region="us-west1")
def onimageresizedwest(event: eventarc_fn.CloudEvent) -> None:
print("Received image resize completed event: ", event.type)
# ...