ขยาย Cloud Firestore ด้วย Cloud Functions (รุ่นที่ 2)

Cloud Functions ช่วยให้คุณทําให้โค้ดใช้งานได้เพื่อจัดการเหตุการณ์ที่เรียกให้แสดงโดยการเปลี่ยนแปลงในฐานข้อมูล Cloud Firestore ซึ่งช่วยให้คุณเพิ่มฟังก์ชันการทำงานฝั่งเซิร์ฟเวอร์ลงในแอปได้อย่างง่ายดายโดยไม่ต้องเรียกใช้เซิร์ฟเวอร์ของคุณเอง

Cloud Functions (รุ่นที่ 2)

Cloud Functions for Firebase (รุ่นที่ 2) ขับเคลื่อนโดย Cloud Run และ Eventarc มอบโครงสร้างพื้นฐานที่มีประสิทธิภาพมากขึ้น การควบคุมขั้นสูงด้านประสิทธิภาพและความสามารถในการปรับขนาด รวมถึงการควบคุมรันไทม์ของฟังก์ชันได้มากขึ้น ดูข้อมูลเพิ่มเติมเกี่ยวกับรุ่นที่ 2 ได้ที่ Cloud Functions for Firebase (รุ่นที่ 2) หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับรุ่นที่ 1 แทน โปรดดูหัวข้อขยายความสามารถของ Cloud Firestore ด้วย Cloud Functions

ทริกเกอร์ฟังก์ชัน Cloud Firestore

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

Node.js

ประเภทเหตุการณ์ ทริกเกอร์
onDocumentCreated ทริกเกอร์เมื่อมีการเขียนเอกสารเป็นครั้งแรก
onDocumentUpdated ทริกเกอร์เมื่อเอกสารมีอยู่แล้วและมีการเปลี่ยนแปลงค่า
onDocumentDeleted ทริกเกอร์เมื่อมีการลบเอกสาร
onDocumentWritten ทริกเกอร์เมื่อมีการเรียกใช้ onDocumentCreated, onDocumentUpdated หรือ onDocumentDeleted
onDocumentCreatedWithAuthContext onDocumentCreated พร้อมข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม
onDocumentWrittenWithAuthContext onDocumentWritten พร้อมข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม
onDocumentDeletedWithAuthContext onDocumentDeleted พร้อมข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม
onDocumentUpdatedWithAuthContext onDocumentUpdated พร้อมข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม

Python (เวอร์ชันตัวอย่าง)

ประเภทเหตุการณ์ ทริกเกอร์
on_document_created ทริกเกอร์เมื่อมีการเขียนเอกสารเป็นครั้งแรก
on_document_updated ทริกเกอร์เมื่อเอกสารมีอยู่แล้วและมีการเปลี่ยนแปลงค่า
on_document_deleted ทริกเกอร์เมื่อมีการลบเอกสาร
on_document_written ทริกเกอร์เมื่อมีการเรียกใช้ on_document_created, on_document_updated หรือ on_document_deleted
on_document_created_with_auth_context on_document_created พร้อมข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม
on_document_updated_with_auth_context on_document_updated พร้อมข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม
on_document_deleted_with_auth_context on_document_deleted พร้อมข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม
on_document_written_with_auth_context on_document_written พร้อมข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม

เหตุการณ์ Cloud Firestore จะทริกเกอร์เมื่อเอกสารมีการเปลี่ยนแปลงเท่านั้น การอัปเดตเอกสาร Cloud Firestore ที่ไม่มีการเปลี่ยนแปลงข้อมูล (การเขียนแบบไม่มีการดำเนินการ) จะไม่สร้างเหตุการณ์การอัปเดตหรือการเขียน คุณจะเพิ่มเหตุการณ์ลงในบางฟิลด์ไม่ได้

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

การเขียนฟังก์ชันที่เรียกใช้ Cloud Firestore

กําหนดทริกเกอร์ฟังก์ชัน

หากต้องการกําหนดทริกเกอร์ Cloud Firestore ให้ระบุเส้นทางเอกสารและประเภทเหตุการณ์ ดังนี้

Node.js

import {
  onDocumentWritten,
  onDocumentCreated,
  onDocumentUpdated,
  onDocumentDeleted,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("my-collection/{docId}", (event) => {
   /* ... */ 
});

Python (เวอร์ชันตัวอย่าง)

from firebase_functions.firestore_fn import (
  on_document_created,
  on_document_deleted,
  on_document_updated,
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_created(document="users/{userId}")
def myfunction(event: Event[DocumentSnapshot]) -> None:

เส้นทางเอกสารจะอ้างอิงเอกสารที่เฉพาะเจาะจงหรือรูปแบบไวลด์การ์ดก็ได้

ระบุเอกสารรายการเดียว

หากต้องการทริกเกอร์เหตุการณ์สําหรับการเปลี่ยนแปลงใดๆ ในเอกสารที่เฉพาะเจาะจง ให้ใช้ฟังก์ชันต่อไปนี้

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("users/marie", (event) => {
  // Your code here
});

Python (เวอร์ชันตัวอย่าง)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/marie")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:

ระบุกลุ่มเอกสารโดยใช้ไวลด์การ์ด

หากต้องการแนบทริกเกอร์กับกลุ่มเอกสาร เช่น เอกสารในคอลเล็กชันหนึ่งๆ ให้ใช้ {wildcard} แทนรหัสเอกสาร

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("users/{userId}", (event) => {
  // If we set `/users/marie` to {name: "Marie"} then
  // event.params.userId == "marie"
  // ... and ...
  // event.data.after.data() == {name: "Marie"}
});

Python (เวอร์ชันตัวอย่าง)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # If we set `/users/marie` to {name: "Marie"} then
  event.params["userId"] == "marie"  # True
  # ... and ...
  event.data.after.to_dict() == {"name": "Marie"}  # True

ในตัวอย่างนี้ เมื่อฟิลด์ใดก็ตามในเอกสารใดก็ตามใน users มีการเปลี่ยนแปลง ระบบจะจับคู่กับไวลด์การ์ดชื่อ userId

หากเอกสารใน users มีคอลเล็กชันย่อยและมีการเปลี่ยนแปลงช่องในเอกสารของคอลเล็กชันย่อยรายการใดรายการหนึ่ง ระบบจะไม่เรียกใช้ไวลด์การ์ด userId

ระบบจะดึงการจับคู่ไวลด์การ์ดจากเส้นทางเอกสารและจัดเก็บไว้ใน event.params คุณกำหนดไวลด์การ์ดได้มากเท่าที่ต้องการเพื่อแทนที่รหัสคอลเล็กชันหรือรหัสเอกสารที่ชัดเจน เช่น

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("users/{userId}/{messageCollectionId}/{messageId}", (event) => {
    // If we set `/users/marie/incoming_messages/134` to {body: "Hello"} then
    // event.params.userId == "marie";
    // event.params.messageCollectionId == "incoming_messages";
    // event.params.messageId == "134";
    // ... and ...
    // event.data.after.data() == {body: "Hello"}
});

Python (เวอร์ชันตัวอย่าง)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/{userId}/{messageCollectionId}/{messageId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # If we set `/users/marie/incoming_messages/134` to {body: "Hello"} then
  event.params["userId"] == "marie"  # True
  event.params["messageCollectionId"] == "incoming_messages"  # True
  event.params["messageId"] == "134"  # True
  # ... and ...
  event.data.after.to_dict() == {"body": "Hello"}

ทริกเกอร์ต้องชี้ไปยังเอกสารเสมอ แม้ว่าคุณจะใช้ไวลด์การ์ดก็ตาม ตัวอย่างเช่น users/{userId}/{messageCollectionId} ไม่ถูกต้องเนื่องจาก {messageCollectionId} เป็นคอลเล็กชัน แต่ users/{userId}/{messageCollectionId}/{messageId} ถูกต้องเนื่องจาก {messageId} จะชี้ไปยังเอกสารเสมอ

ทริกเกอร์เหตุการณ์

ทริกเกอร์ฟังก์ชันเมื่อสร้างเอกสารใหม่

คุณสามารถทริกเกอร์ฟังก์ชันให้ทำงานทุกครั้งที่สร้างเอกสารใหม่ในคอลเล็กชัน ฟังก์ชันตัวอย่างนี้จะทริกเกอร์ทุกครั้งที่มีการเพิ่มโปรไฟล์ผู้ใช้ใหม่

Node.js

import {
  onDocumentCreated,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.createuser = onDocumentCreated("users/{userId}", (event) => {
    // Get an object representing the document
    // e.g. {'name': 'Marie', 'age': 66}
    const snapshot = event.data;
    if (!snapshot) {
        console.log("No data associated with the event");
        return;
    }
    const data = snapshot.data();

    // access a particular field as you would any JS property
    const name = data.name;

    // perform more operations ...
});

หากต้องการข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม ให้ใช้ onDocumentCreatedWithAuthContext

Python (เวอร์ชันตัวอย่าง)

from firebase_functions.firestore_fn import (
  on_document_created,
  Event,
  DocumentSnapshot,
)

@on_document_created(document="users/{userId}")
def myfunction(event: Event[DocumentSnapshot]) -> None:
  # Get a dictionary representing the document
  # e.g. {'name': 'Marie', 'age': 66}
  new_value = event.data.to_dict()

  # Access a particular field as you would any dictionary
  name = new_value["name"]

  # Perform more operations ...

ทริกเกอร์ฟังก์ชันเมื่อมีการอัปเดตเอกสาร

นอกจากนี้ คุณยังทริกเกอร์ฟังก์ชันให้ทำงานเมื่อมีการอัปเดตเอกสารได้ด้วย ฟังก์ชันตัวอย่างนี้จะทํางานหากผู้ใช้เปลี่ยนโปรไฟล์

Node.js

import {
  onDocumentUpdated,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.updateuser = onDocumentUpdated("users/{userId}", (event) => {
    // Get an object representing the document
    // e.g. {'name': 'Marie', 'age': 66}
    const newValue = event.data.after.data();

    // access a particular field as you would any JS property
    const name = newValue.name;

    // perform more operations ...
});

หากต้องการข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม ให้ใช้ onDocumentUpdatedWithAuthContext

Python (เวอร์ชันตัวอย่าง)

from firebase_functions.firestore_fn import (
  on_document_updated,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_updated(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # Get a dictionary representing the document
  # e.g. {'name': 'Marie', 'age': 66}
  new_value = event.data.after.to_dict()

  # Access a particular field as you would any dictionary
  name = new_value["name"]

  # Perform more operations ...

ทริกเกอร์ฟังก์ชันเมื่อมีการลบเอกสาร

นอกจากนี้ คุณยังทริกเกอร์ฟังก์ชันเมื่อมีการลบเอกสารได้ด้วย ตัวอย่างฟังก์ชันนี้จะทํางานเมื่อผู้ใช้ลบโปรไฟล์ผู้ใช้

Node.js

import {
  onDocumentDeleted,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.deleteuser = onDocumentDeleted("users/{userId}", (event) => {
    // Get an object representing the document
    // e.g. {'name': 'Marie', 'age': 66}
    const snap =  event.data;
    const data =  snap.data();

    // perform more operations ...
});

หากต้องการข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม ให้ใช้ onDocumentDeletedWithAuthContext

Python (เวอร์ชันตัวอย่าง)

from firebase_functions.firestore_fn import (
  on_document_deleted,
  Event,
  DocumentSnapshot,
)

@on_document_deleted(document="users/{userId}")
def myfunction(event: Event[DocumentSnapshot|None]) -> None:
  # Perform more operations ...

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

หากไม่สนใจประเภทของเหตุการณ์ที่เริ่มทํางาน คุณสามารถรอฟังการเปลี่ยนแปลงทั้งหมดในเอกสาร Cloud Firestore โดยใช้ทริกเกอร์เหตุการณ์ "เขียนเอกสาร" ฟังก์ชันตัวอย่างนี้จะทํางานหากมีการสร้าง อัปเดต หรือลบผู้ใช้

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.modifyuser = onDocumentWritten("users/{userId}", (event) => {
    // Get an object with the current document values.
    // If the document does not exist, it was deleted
    const document =  event.data.after.data();

    // Get an object with the previous document values
    const previousValues =  event.data.before.data();

    // perform more operations ...
});

หากต้องการข้อมูลการตรวจสอบสิทธิ์เพิ่มเติม ให้ใช้ onDocumentWrittenWithAuthContext

Python (เวอร์ชันตัวอย่าง)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot | None]]) -> None:
  # Get an object with the current document values.
  # If the document does not exist, it was deleted.
  document = (event.data.after.to_dict()
              if event.data.after is not None else None)

  # Get an object with the previous document values.
  # If the document does not exist, it was newly created.
  previous_values = (event.data.before.to_dict()
                     if event.data.before is not None else None)

  # Perform more operations ...

การอ่านและเขียนข้อมูล

เมื่อทริกเกอร์ฟังก์ชัน ระบบจะแสดงภาพรวมของข้อมูลที่เกี่ยวข้องกับเหตุการณ์ คุณสามารถใช้ภาพรวมนี้เพื่ออ่านหรือเขียนลงในเอกสารที่ทริกเกอร์เหตุการณ์ หรือใช้ Firebase Admin SDK เพื่อเข้าถึงส่วนอื่นๆ ของฐานข้อมูล

ข้อมูลเหตุการณ์

การอ่านข้อมูล

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

Node.js

exports.updateuser2 = onDocumentUpdated("users/{userId}", (event) => {
    // Get an object with the current document values.
    // If the document does not exist, it was deleted
    const newValues =  event.data.after.data();

    // Get an object with the previous document values
    const previousValues =  event.data.before.data();
});

Python (เวอร์ชันตัวอย่าง)

@on_document_updated(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # Get an object with the current document values.
  new_value = event.data.after.to_dict()

  # Get an object with the previous document values.
  prev_value = event.data.before.to_dict()

คุณสามารถเข้าถึงพร็อพเพอร์ตี้ได้เช่นเดียวกับในออบเจ็กต์อื่นๆ หรือจะใช้ฟังก์ชัน get เพื่อเข้าถึงช่องที่เฉพาะเจาะจงก็ได้

Node.js

// Fetch data using standard accessors
const age = event.data.after.data().age;
const name = event.data.after.data()['name'];

// Fetch data using built in accessor
const experience = event.data.after.data.get('experience');

Python (เวอร์ชันตัวอย่าง)

# Get the value of a single document field.
age = event.data.after.get("age")

# Convert the document to a dictionary.
age = event.data.after.to_dict()["age"]

การเขียนข้อมูล

การเรียกใช้ฟังก์ชันแต่ละรายการจะเชื่อมโยงกับเอกสารที่เฉพาะเจาะจงในฐานข้อมูลCloud Firestore คุณสามารถเข้าถึงเอกสารดังกล่าวในสแนปชอตที่แสดงผลในฟังก์ชัน

การอ้างอิงเอกสารจะมีเมธอดต่างๆ เช่น update(), set() และ remove() เพื่อให้คุณแก้ไขเอกสารที่ทริกเกอร์ฟังก์ชันได้

Node.js

import { onDocumentUpdated } from "firebase-functions/v2/firestore";

exports.countnamechanges = onDocumentUpdated('users/{userId}', (event) => {
  // Retrieve the current and previous value
  const data = event.data.after.data();
  const previousData = event.data.before.data();

  // We'll only update if the name has changed.
  // This is crucial to prevent infinite loops.
  if (data.name == previousData.name) {
    return null;
  }

  // Retrieve the current count of name changes
  let count = data.name_change_count;
  if (!count) {
    count = 0;
  }

  // Then return a promise of a set operation to update the count
  return data.after.ref.set({
    name_change_count: count + 1
  }, {merge: true});

});

Python (เวอร์ชันตัวอย่าง)

@on_document_updated(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # Get the current and previous document values.
  new_value = event.data.after
  prev_value = event.data.before

  # We'll only update if the name has changed.
  # This is crucial to prevent infinite loops.
  if new_value.get("name") == prev_value.get("name"):
      return

  # Retrieve the current count of name changes
  count = new_value.to_dict().get("name_change_count", 0)

  # Update the count
  new_value.reference.update({"name_change_count": count + 1})

เข้าถึงข้อมูลการตรวจสอบสิทธิ์ของผู้ใช้

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

Node.js

  • onDocumentCreatedWithAuthContext
  • onDocumentWrittenWithAuthContext
  • onDocumentDeletedWithAuthContext
  • onDocumentUpdatedWithAuthContext

Python (เวอร์ชันตัวอย่าง)

  • on_document_created_with_auth_context
  • on_document_updated_with_auth_context
  • on_document_deleted_with_auth_context
  • on_document_written_with_auth_context

ดูข้อมูลเกี่ยวกับข้อมูลที่มีอยู่ในบริบทการตรวจสอบสิทธิ์ได้ที่หัวข้อบริบทการตรวจสอบสิทธิ์ ตัวอย่างต่อไปนี้แสดงวิธีเรียกข้อมูลการตรวจสอบสิทธิ์

Node.js

import { onDocumentWrittenWithAuthContext } from "firebase-functions/v2/firestore"

exports.syncUser = onDocumentWrittenWithAuthContext("users/{userId}", (event) => {
    const snapshot = event.data.after;
    if (!snapshot) {
        console.log("No data associated with the event");
        return;
    }
    const data = snapshot.data();

    // retrieve auth context from event
    const { authType, authId } = event;

    let verified = false;
    if (authType === "system") {
      // system-generated users are automatically verified
      verified = true;
    } else if (authType === "unknown" || authType === "unauthenticated") {
      // admin users from a specific domain are verified
      if (authId.endsWith("@example.com")) {
        verified = true;
      }
    }

    return data.after.ref.set({
        created_by: authId,
        verified,
    }, {merge: true}); 
}); 

Python (เวอร์ชันตัวอย่าง)

@on_document_updated_with_auth_context(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:

  # Get the current and previous document values.
  new_value = event.data.after
  prev_value = event.data.before

  # Get the auth context from the event
  user_auth_type = event.auth_type
  user_auth_id = event.auth_id

ข้อมูลนอกเหตุการณ์ทริกเกอร์

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

Node.js

const { initializeApp } = require('firebase-admin/app');
const { getFirestore, Timestamp, FieldValue } = require('firebase-admin/firestore');

initializeApp();
const db = getFirestore();

exports.writetofirestore = onDocumentWritten("some/doc", (event) => {
    db.doc('some/otherdoc').set({ ... });
  });

  exports.writetofirestore = onDocumentWritten('users/{userId}', (event) => {
    db.doc('some/otherdoc').set({
      // Update otherdoc
    });
  });

Python (เวอร์ชันตัวอย่าง)

from firebase_admin import firestore, initialize_app
import google.cloud.firestore

initialize_app()

@on_document_written(document="some/doc")
def myfunction(event: Event[Change[DocumentSnapshot | None]]) -> None:
  firestore_client: google.cloud.firestore.Client = firestore.client()
  firestore_client.document("another/doc").set({
      # ...
  })

ข้อจำกัด

โปรดทราบข้อจำกัดต่อไปนี้สำหรับทริกเกอร์ Cloud Firestore สำหรับ Cloud Functions

  • Cloud Functions (รุ่นที่ 1) ต้องมีฐานข้อมูล "(default)" ที่มีอยู่เดิมในโหมดเนทีฟของ Firestore แต่ไม่รองรับCloud Firestoreฐานข้อมูลที่ชื่อหรือโหมด Datastore โปรดใช้ Cloud Functions (รุ่นที่ 2) เพื่อกําหนดค่าเหตุการณ์ในกรณีดังกล่าว
  • เราไม่รับประกันการสั่งซื้อ การเปลี่ยนแปลงอย่างรวดเร็วอาจทริกเกอร์การเรียกใช้ฟังก์ชันในลําดับที่ไม่คาดคิด
  • ระบบจะส่งเหตุการณ์อย่างน้อย 1 ครั้ง แต่เหตุการณ์เดียวอาจส่งผลให้มีการเรียกใช้ฟังก์ชันหลายครั้ง หลีกเลี่ยงการพึ่งพากลไก "ดำเนินการเพียงครั้งเดียว" และเขียนฟังก์ชันที่ทำงานแบบ idempotent
  • Cloud Firestore ในโหมด Datastoreต้องใช้ Cloud Functions (รุ่นที่ 2) Cloud Functions (รุ่นที่ 1) ไม่รองรับโหมด Datastore
  • ทริกเกอร์จะเชื่อมโยงกับฐานข้อมูลเดียว คุณสร้างทริกเกอร์ที่ตรงกับฐานข้อมูลหลายรายการไม่ได้
  • การลบฐานข้อมูลจะไม่ลบทริกเกอร์ของฐานข้อมูลนั้นโดยอัตโนมัติ ทริกเกอร์จะหยุดส่งเหตุการณ์ แต่จะยังคงอยู่จนกว่าคุณจะลบทริกเกอร์
  • หากเหตุการณ์ที่ตรงกันมีขนาดใหญ่เกินขนาดคำขอสูงสุด ระบบอาจไม่ส่งเหตุการณ์ไปยัง Cloud Functions (รุ่นที่ 1)
    • ระบบจะบันทึกเหตุการณ์ที่ส่งไม่ได้เนื่องจากขนาดคำขอไว้ในบันทึกของแพลตฟอร์ม และนับรวมไว้ในการใช้งานบันทึกของโปรเจ็กต์
    • คุณดูบันทึกเหล่านี้ได้ในเครื่องมือสำรวจบันทึกที่มีข้อความ "ส่งเหตุการณ์ไปยังฟังก์ชัน Cloud ไม่ได้เนื่องจากมีขนาดใหญ่เกินขีดจํากัดของรุ่นที่ 1..." ความรุนแรงระดับ error คุณจะเห็นชื่อฟังก์ชันใต้ช่อง functionName หากช่อง receiveTimestamp ยังอยู่ภายใน 1 ชั่วโมงนับจากนี้ คุณสามารถอนุมานเนื้อหาเหตุการณ์จริงได้โดยอ่านเอกสารที่เป็นปัญหาพร้อมภาพหน้าจอก่อนและหลังการประทับเวลา
    • คุณหลีกเลี่ยงจังหวะดังกล่าวได้โดยทำดังนี้
      • ย้ายข้อมูลและอัปเกรดเป็น Cloud Functions (รุ่นที่ 2)
      • ลดขนาดเอกสาร
      • ลบ Cloud Functions ที่เป็นปัญหา
    • คุณสามารถปิดการบันทึกได้โดยใช้การยกเว้น แต่โปรดทราบว่าระบบจะยังคงไม่ส่งเหตุการณ์ที่ทำให้เกิดข้อผิดพลาด